等效表达式可以产生不同的float结果吗

时间:2010-11-16 10:10:19

标签: floating-point floating-accuracy

this answer的讨论让我想到了浮点数的相等性和等价性。我知道浮点数不能总是准确地表示。问题是,在使用浮点运算时,是否存在数学上等效的表达式会产生不同的结果?你能提供一个例子吗?

编辑:让我更清楚一点。我知道使用不同编译器或不同机器的相同代码可以返回不同的结果。我正在寻找的是两个数学上等效的表达式,我可以在我的Python解释器/ C ++程序/无论如何并得到意想不到的结果中进行比较。

3 个答案:

答案 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");
}