所以一般来说,我理解指定3.和3.0d0之间的区别,区别在于计算机存储的位数。在进行算术运算时,我通常会确保所有内容都是双精度的。但是,我对以下操作感到困惑:
64 ^(1./3。)vs. 64 ^(1.0d0 / 3.0d0)
我花了几个星期才发现错误,我将64 ^(1.0d0 / 3.0d0)的输出分配给一个整数。因为64 ^(1.0d0 / 3.0d0)返回3.999999,所以整数得到值3而不是4.但是,64 ^(1./3。)= 4.00000。有人可以向我解释为什么使用1./3是明智的。与1.0d0 / 3.0d0在这里?
答案 0 :(得分:2)
问题不是单一与双精度。与真实数字相比,所有浮点计算都不精确。在将实数赋给整数时,Fortran会截断。您可能希望使用Fortran内在nint
。
答案 1 :(得分:0)
这是一种特殊的偶然情况,其中较低的精度计算给出了精确的结果。您可以在没有整数转换问题的情况下看到这一点:
write(*,*)4.d0-64**(1./3.),4.d0-64**(1.d0/3.d0)
0.000000000 4.440892E-016
一般来说,这不会发生,这里的双精度值是"更好"
write(*,*)13.d0-2197**(1./3.),13.d0-2197**(1.d0/3.d0)
-9.5367E-7 1.77E-015
这里,自从s.p. calc略高,它给出了整数转换的正确值,而d.p.即使浮点误差较小,结果也会向下舍入,因此是错误的。
所以一般来说,不应该考虑使用单一精度作为首选。
事实上,64和125似乎是s.p.的唯一特例。 calc给出了一个完美的立方根,而d.p. calc没有。