Fortran 95:if 条件的内联计算

发布于 2024-10-16 17:04:26 字数 411 浏览 6 评论 0原文

这里有一小段代码,返回 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

茶色山野 2024-10-23 17:04:26

浮点运算有许多微妙的问题。一种形式的源代码可以生成与另一种看似几乎相同的源代码不同的机器指令。例如,“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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文