Fortran 95:if 条件的内联计算
这里有一小段代码,返回 epsilon() 以获得实际值:
program epstest
real :: eps=1.0, d
do
d=1.0+eps
if (d==1.0) then
eps=eps*2
exit
else
eps=eps/2
end if
end do
write(*,*) eps, epsilon(d)
pause
end program
现在,当我用程序替换 if 条件时,
if (1.0+eps==1.0) then
应该有相同的返回值,但不幸的是没有!我在 Linux 和 Windows 上使用最新(快照)版本的 g95 对其进行了测试。
有人可以向我解释这个问题吗?
Here a small snippet of code that returns epsilon() for a real value:
program epstest
real :: eps=1.0, d
do
d=1.0+eps
if (d==1.0) then
eps=eps*2
exit
else
eps=eps/2
end if
end do
write(*,*) eps, epsilon(d)
pause
end program
Now, when I replace the if condition by
if (1.0+eps==1.0) then
the program should have the same in return but it unfortunately does not! I tested it with the latest (snapshot) release of g95 on Linux and Windows.
Can someone explain that issue to me?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
浮点运算有许多微妙的问题。一种形式的源代码可以生成与另一种看似几乎相同的源代码不同的机器指令。例如,“d”可能会存储到内存位置,而“1.0 + eps”可能仅使用寄存器进行计算……这可能会导致不同的精度。
更一般地说,为什么不使用 Fortran 95 提供的内在函数来揭示实数特定精度的特征?
Floating point arithmetic has many subtle issues. One form of source code can generate different machine instructions than another seemingly almost identical source code. For example, "d" might get stored to a memory location, while "1.0 + eps" might be evaluated solely with registers ... this can cause different precision.
More generally, why not use the intrinsic functions provided for Fortran 95 that disclose the characteristics of a particular precision of reals?