C++转换为更精确的类型并失去准确性?

Vin*_*ent 3 c++ floating-point precision

考虑两种计​​算方式:

  1. 双精度数据
    - >应用具有双精度临时值的函数
    - >返回结果
  2. 双精度数据
    - >强制转换为long double
    - >应用具有长双精度临时值的函数
    - >强制转换为double
    - >返回结果

与第一个解决方案相比,第二个解决方案能否提供不太准确的结果?如果是,在什么情况下是?

Eri*_*hil 5

是.证明:设c = 0x1p-53 + 0x1p-64.评估1 + cc-1的double和long double(普通Intel格式,64位有效数字).在double中,结果为0,这是数学上准确的答案.在long double中,结果是-0x1p-64,这是错误的(当转换为double时仍然是错误的).

在double中,1 + c增加略多于ULP(最低精度单位)的一半,因此它产生1加上ULP.减去c减去略多于ULP的一半,因此结果中最接近的可表示数字(以双为单位)为1,因此生成1.然后减去1得到0.

在long double中,1 + c增加0x1p-53加上一半ULP为1.(在long double中,1的ULP为0x1p-63.)因为结果与两个最接近的可表示数字的距离完全相同(长double),返回低位0的那个,1 + 0x1p-53.然后减去c的确切结果是1 - 0x1p-64.这是完全可以表示的,因此返回.最后,减去1会产生-0x1p-64.