标签: inexact-arithmetic

在Python中生成两个文件的"模糊"差异,并对浮点数进行近似比较

我有比较两个文件的问题.基本上,我想要做的是两个文件之间类似于UNIX的差异,例如:

$ diff -u左文件右文件

但是我的两个文件包含浮点数; 并且因为这些文件是在不同的体系结构上生成的(但是计算相同的东西),浮动值并不完全相同(它们可能因1e-10而不同).但我通过'差异'文件寻找的是找到我认为是显着差异的东西(例如差异大于1e-4); 使用UNIX命令diff时,几乎所有包含浮动值的行都不同!这是我的问题:我如何得到像'diff -u'提供的结果差异,但对浮点数比较的限制较少?

我以为我会写一个Python的脚本来做到这一点,并找到了模块difflib,它提供了类似diff的比较.但是我发现的文档解释了如何按原样使用它(通过单一方法),并解释了内部对象,但我找不到任何关于如何自定义difflib对象以满足我的需求(比如仅重写比较方法或...)我想解决方案可能是检索统一的差异,然后"手动"解析它以消除我的"错误"差异,这不是优雅的; 我更愿意使用现有的框架.

那么,有没有人知道如何自定义这个lib,以便我可以做我想要的东西?或者至少指出我正确的方向......如果不是在Python中,也许shell脚本可以完成工作?

任何帮助将不胜感激!提前感谢您的回答!

python floating-point fuzzy-comparison inexact-arithmetic

7
推荐指数
1
解决办法
1775
查看次数

如何将任何数字转换为Clojure中的clojure.lang.Ratio类型?

在Scheme中我可以做到:

#;> (numerator 1/3)
1
#;> (denominator 1/3)
3
Run Code Online (Sandbox Code Playgroud)

在Clojure中我可以做类似的事情:

user=> (numerator 1/3)
1
user=> (denominator 1/3)
3
Run Code Online (Sandbox Code Playgroud)

但在Scheme中我可以这样做:

#;> (numerator 0.3)
3.0
Run Code Online (Sandbox Code Playgroud)

在Clojure中是不可能的:

user=> (numerator 0.3)

ClassCastException java.lang.Double cannot be cast to clojure.lang.Ratio  clojure.core/numerator (core.clj:3306)
Run Code Online (Sandbox Code Playgroud)

如何将Double(或实际上任何类型的数字)转换为clojure.lang.Ratio?

在Scheme中我们还有inexact->exactClojure中的"double to ratio",但我找不到类似的东西.

math clojure rational-numbers inexact-arithmetic

6
推荐指数
1
解决办法
1275
查看次数

双0.0是否总是在便携式C中完全表示?

是否可以在具有符合ANSI标准的C编译器的所有环境中使用以下代码?

double n = 0;
assert(n == 0);
Run Code Online (Sandbox Code Playgroud)

那么C++呢?

c c++ bit-representation inexact-arithmetic

2
推荐指数
2
解决办法
1957
查看次数

加法和减法后浮点数小于等于

在一系列浮点算术运算之后,是否存在一个"最佳实践",而不是与浮点数相等的比较?

我在R中有以下示例,但该问题不仅适用于R,而且适用于使用浮点的任何语言.我有一个双x = 1,我应用了一系列的加法和减法.最后x应该是一个但不是由于浮点运算(从我收集的).这是一个例子

> stop_times <- seq(0.25, 2, by = .25)
> expr <- expression(replicate(100,{
    x <- 1

    for(i in 1:10) {
      tmp <- rexp(1, 1)
      n <- sample.int(1e2, 1)
      delta <- tmp / n
      for(j in 1:n)
        x <- x - delta
      x <- x + tmp
    }

    # "correct" answer is 4  
    which.max(x <= stop_times)
  }))
> eval(expr)
  [1] 5 5 5 4 4 4 5 5 5 4 5 4 4 4 …
Run Code Online (Sandbox Code Playgroud)

floating-point r floating-accuracy epsilon inexact-arithmetic

1
推荐指数
1
解决办法
104
查看次数

1
推荐指数
1
解决办法
1745
查看次数

将浮动除以10

可能重复:
为什么十进制数不能用二进制表示?

我正在开发一个非常简单的C++数学使用算法.

我有一个名为"step"的浮点变量,每次我完成while循环,我需要将步除以10.

所以我的代码有点像这样,

float step = 1;
while ( ... ){
      //the codes
      step /= 10;
}
Run Code Online (Sandbox Code Playgroud)

在我愚蠢的简单逻辑中,结束了.步骤将除以10,从1到0.1,从0.1到0.01.

但事实并非如此,而是出现了0.100000000001之类的东西.我就像"地狱里的东西"

有人可以帮我这个.这可能是我不完全理解的数据类型本身.因此,如果有人可以进一步解释,我们将不胜感激.

c++ floating-point floating-accuracy inexact-arithmetic

1
推荐指数
1
解决办法
1682
查看次数

是否可以预测Perl的十进制/浮点数何时会出错?

在一个方面,我理解Perl的浮点数是不精确的二进制表示,这导致Perl的数学有时是错误的.我不明白的是,为什么有时这些花车似乎给出了确切的答案,有时则不是. 是否有可能预测Perl的浮动数学何时会给出错误(即不准确的答案)?

例如,在下面的代码中,当减法为"16.12 - 15.13"时,Perl的数学错误1次,当问题为"26.12 - 25.13"时错误2次,​​当问题为"36.12 - 35.13"时错误20次.此外,由于某些原因,在所有上述测试用例中,我们的减法问题(即$ subtraction_problem)的结果开始是错误的,但是趋向于变得更正确,我们添加或减去它的次数越多(使用$ X).这没有任何意义,为什么我们在算术问题中加入或减去的越多,它就越有可能变得正确(即精确)?

my $subtraction_problem = 16.12 - 15.13;
my $perl_math_failures = 0;
for (my $x = -25; $x< 25; $x++){
        my $result = $subtraction_problem +$x;
        print "$result\n";
        $perl_math_failures++ if length $result > 6;
}
print "There were $perl_math_failures perl math failures!\n";
Run Code Online (Sandbox Code Playgroud)

math binary perl decimal inexact-arithmetic

-2
推荐指数
1
解决办法
152
查看次数