对this answer的讨论让我想到了浮点数的相等性和等价性。我知道浮点数不能总是准确地表示。问题是,在使用浮点运算时,是否存在数学上等效的表达式会产生不同的结果?你能提供一个例子吗?
编辑:让我更清楚一点。我知道使用不同编译器或不同机器的相同代码可以返回不同的结果。我正在寻找的是两个数学上等效的表达式,我可以在我的Python解释器/ C ++程序/无论如何并得到意想不到的结果中进行比较。
答案 0 :(得分:3)
在数学上是等价的 将产生不同的表达式 使用浮点时的结果 算术?
绝对。事实上,你应该期望这种情况经常发生。
在不同的计算机或编译器上甚至是相同的代码can yield different results。
你能提供一个例子吗?
不确定。这个Java代码应该重复产生两个不同的结果:
public strictfp class Test {
public static void main(String[] args) throws Exception {
float a = 0.7f;
float b = 0.3f;
float c = 0.1f;
float r1 = ((a * b) * c);
float r2 = (a * (b * c));
System.out.println(r1);
System.out.println(r2);
}
}
答案 1 :(得分:2)
是的,例如比较。
x = (a * b) / c;
与
x = a * (b / c);
以下是C中的一个示例:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double a, b, c, x1, x2;
a = sqrt((double)rand());
b = sqrt((double)rand());
c = sqrt((double)rand());
x1 = (a * b) / c;
x2 = a * (b / c);
printf("a = %.20f\n", a);
printf("b = %.20f\n", b);
printf("c = %.20f\n", c);
printf("x1 = %.20f\n", x1);
printf("x2 = %.20f\n", x2);
printf("x1 - x2 = %.20f\n", x1 - x2);
return 0;
}
对我来说,这会得到以下结果:
$ gcc -O3 -Wall math.c -o math
$ ./math
a = 129.64181424216494065149
b = 16807.00000000000000000000
c = 40282.13093916457728482783
x1 = 54.09073256970189902404
x2 = 54.09073256970190612947
x1 - x2 = -0.00000000000000710543
$
(Core i7,gcc 4.0.1,Mac OS X 10.6)
请注意,对于任何给定的表达式以及不同的CPU,编译器,编译器开关,数学库等,通常可能会得到不同的结果。
答案 2 :(得分:0)
我尝试使用乘法和加法:
在伪c代码中
float x = 1/7;
float y = x * 4;
float z = x + x + x + x;
if (y != z) {
printf("oh noes!\n");
}