4

我在 C 中实现了一个使用浮点数的算法。当我在 i386 上编译和运行时,我得到的结果与我在 armel 上编译和运行时得到的结果不同。特别是 int-by-float 的除法,会产生不同的浮点数。

我从我的算法中提取了一些代码来演示这个问题:

#include <stdio.h>
void main(void)
{
    float x = 4.80000019;
    float y = 4.80000019;
    int a = 38000;
    int b = 10000;
    int result = (a/x)+(b/y);
    printf("%.8f, %.8f\n", x, y); // same on i386 and armel
    printf("%f, %f\n", a/x, b/y); // slightly different on each
    printf("%d\n", result);       // prints 9999 on i386, and 10000 on armel
}

谁能解释为什么这两个平台会产生不同的结果?

亚历克斯

4

3 回答 3

6

查找“超精度”。要在现代 x86 上抑制它,请使用-msse2 -mfpmath=sse.

于 2013-02-07T15:08:02.877 回答
4

现在无法针对 arm 测试它,但即使在 i386 和 amd64 上它也有不同的结果——在同一个 CPU 上,但使用 -m32 标志编译。这是因为内部 FPU 结构 - i387 使用 80 位浮点寄存器来执行操作,然后将结果收缩回 32 位浮点数(如果需要)。在 amd64 指令集中,使用了 SSE,它没有那么精确的寄存器(但仍然是_at_least_ 32 位)。我想 ARM 也至少有 32 位,但不能保证高于此的任何内容。

于 2013-02-07T11:35:05.313 回答
2

C 标准没有规定应该实现多少东西,并允许实现特定的行为。浮点运算就是这样一个领域,其中不同的实现和不同的结果是完全可以的。您要么忍受它,要么构建解决方法。

于 2013-02-07T11:45:26.687 回答