代码之家  ›  专栏  ›  技术社区  ›  sbooth

为什么两个浮点乘法给出的答案不同于一个?

  •  2
  • sbooth  · 技术社区  · 14 年前

    我最近遇到了一个问题,我没有得到我期望的数值结果。我将其追踪到以下示例所示的问题:

    #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,1)范围内。

    1 回复  |  直到 14 年前
        1
  •  14
  •   AnT stands with Russia    14 年前

    很明显,你期望的结果是相同的,因为你假设 (1 << 31) 等于乘 (1 << 23) 然后 (1 << 8) . 一般情况下,它们是不一样的。您正在执行 (1<<31) signed int (1<<31) 表达 溢流 ,而两者 (1<<23) (1<<8) 没有溢出。这立即意味着第一次乘法的结果是不可预测的。

    在一个只有31位值表示的平台上 int 类型。您至少需要32个值形成位来进行有意义的计算 (1<<31) .

    如果你想 (1<<31) 域: (1u << 31) (1u << 23) (1u << 8)