我有比较两个文件的问题.基本上,我想要做的是两个文件之间类似于UNIX的差异,例如:
$ diff -u左文件右文件
但是我的两个文件包含浮点数; 并且因为这些文件是在不同的体系结构上生成的(但是计算相同的东西),浮动值并不完全相同(它们可能因1e-10而不同).但我通过'差异'文件寻找的是找到我认为是显着差异的东西(例如差异大于1e-4); 使用UNIX命令diff时,几乎所有包含浮动值的行都不同!这是我的问题:我如何得到像'diff -u'提供的结果差异,但对浮点数比较的限制较少?
我以为我会写一个Python的脚本来做到这一点,并找到了模块difflib,它提供了类似diff的比较.但是我发现的文档解释了如何按原样使用它(通过单一方法),并解释了内部对象,但我找不到任何关于如何自定义difflib对象以满足我的需求(比如仅重写比较方法或...)我想解决方案可能是检索统一的差异,然后"手动"解析它以消除我的"错误"差异,这不是优雅的; 我更愿意使用现有的框架.
那么,有没有人知道如何自定义这个lib,以便我可以做我想要的东西?或者至少指出我正确的方向......如果不是在Python中,也许shell脚本可以完成工作?
任何帮助将不胜感激!提前感谢您的回答!
在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",但我找不到类似的东西.
是否可以在具有符合ANSI标准的C编译器的所有环境中使用以下代码?
double n = 0;
assert(n == 0);
Run Code Online (Sandbox Code Playgroud)
那么C++呢?
在一系列浮点算术运算之后,是否存在一个"最佳实践",而不是与浮点数相等的比较?
我在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
inexact->exactSICP中描述的Scheme程序如何运作?
可能重复:
为什么十进制数不能用二进制表示?
我正在开发一个非常简单的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之类的东西.我就像"地狱里的东西"
有人可以帮我这个.这可能是我不完全理解的数据类型本身.因此,如果有人可以进一步解释,我们将不胜感激.
在一个方面,我理解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)