Vin*_*ent 3 c++ floating-point precision
考虑两种计算方式:
与第一个解决方案相比,第二个解决方案能否提供不太准确的结果?如果是,在什么情况下是?
是.证明:设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.