|
采用Fortran双精度计算c=c1^2 - (c3^2)*c2,分别用debug和release模式编译出可执行程序,编译器是intel Parallel Studio XE 2018。运行后发现计算结果在小数点最后一位(第15位)上不一样。
于是输出c1,c2和c3检查差异的来源。虽然双精度的有效位数是小数点后15位,但是强制输出小数点后18位。结果显示c1,c2和c3在两种模式中直到小数点后18位都完全相同,但是(c3^2)*c2的结果却出现差异。
数据如下,黑色加粗部分表示15位小数点。
c1=3.745496116952728386E-04, c2=2.364288313097455060E-03, c3=7.071067835889063291E-01,
c1^2在两种模式下结果完全一样,等于 3.745496116952728386E-04
(c3^2)*c2在两种模式中分别等于debug: 1.182144164581275247E-03, release: 1.182144164581275031E-03,
相减得到c在两种模式中分别等于debug: -8.075945528860024088E-04, release: -8.075945528860021920E-04。
(c3^2)*c2的差异出现在16位及以后,但是影响到了c的第十五位。说明16位以后的数字也参与了计算,并对结果产生了影响。
那么问题来了,
1. 双精度只能保存到小数点后15位,16到18位的小数点是怎么来的,为什么能参与计算?
2.两种模式中c1, c2和c3直到小数点18位完全一样,为什么通过乘法运算得到的(c3^2)*c2在小数点后第16位上出现差异?
|
|