2010-09-05 94 views
2

我最近遇到了一个问题,我没有得到我期望的数字结果。我跟踪它到由下面的例子示出的问题:为什么两个浮点乘法给出的答案不同于一个?

#include <stdio.h> 

int main() 
{ 
    double sample = .5; 
    int a = (int)(sample * (1 << 31)); 
    int b = (int)(sample * (1 << 23) * (1 << 8)); 
    printf("a = %#08x, b = %#08x\n", a, b); 
} 
// Output is: a = 0xc0000000, b = 0x40000000 

为什么是由(1 < < 31)大于由(1 < < 23)*相乘的结果不同相乘的结果( 1 < < 8)?我预计这两个人会给出相同的答案,但他们不会。

我应该注意到我所有的浮点值都在[-1,1)范围内。

+0

你的代码和问题是不同的。 – leppie 2010-09-05 04:42:40

+1

谢谢,我编辑了问题以匹配代码。 – sbooth 2010-09-05 04:58:04

回答

14

由于您认为乘以(1 << 31)与乘以(1 << 23),然后乘以(1 << 8),您显然希望获得相同的结果。一般情况下它们不一样。您正在执行signed int域中的(1 << 31)计算。如果您的平台使用32位整数,(1 << 31)表达式溢出,而(1 << 23)(1 << 8)都没有溢出。这立即意味着第一次乘法的结果是不可预知的。

换句话说,在int类型的值表示中只有31位的平台上执行(1 << 31)没有任何意义。您至少需要32个数值位来有意义地计算(1 << 31)

如果你希望你的(1 << 31)是有道理的,在其计算无符号域:(1u << 31)(1u << 23)(1u << 8)。这应该给你一致的结果。或者,您可以使用更大的有符号整数类型。

+0

非常明确的解释,谢谢。 – sbooth 2010-09-05 05:50:05

相关问题