【发布时间】:2020-03-29 14:49:48
【问题描述】:
我有一个看似简单的问题:我想通过执行以下操作来检测 Fortran 中的浮点加法是否会溢出:
real*8 :: a, b, c
a = ! some value
b = ! some value
if (b > DOUBLE_MAX - a) then
! handle overflow
else
c = a + b
问题是我不知道DOUBLE_MAX 应该是什么。我知道浮点数是如何根据 IEEE 754 表示的,但双精度浮点数可表示的最大值对于 real*8 类型的变量似乎太大了(即,如果我尝试分配 1.7976931348623157e+308对这样一个变量 gfortran 抱怨)。 C 和 C++ 为此目的预定义了常量/通用函数,但我找不到 Fortran 等价物。
注意:我知道real*8 不是真正标准的一部分,但似乎没有其他方法可以可靠地指定浮点数应使用双精度格式。
【问题讨论】:
-
我在这里找了一个副本但没有找到,虽然我希望能找到一个。不幸的是,有很多帖子包括“巨大”作为短语。请随意将其指向重复项,我将删除我的答案。
-
“似乎没有其他方法可以可靠地指定浮点数应使用双精度” 有多种方法,但
real*8不是其中之一他们。它指定了一个具有 8 字节存储大小的实数,而不是我所知道的任何含义的双精度。 Fortran 双精度使用double precision或设置为kind(1.0_dp)的种类常量。如果你想要IEEE双精度浮点类型,使用IEEE模块,不要使用real*8,那什么都保证。 -
Strictly real*8 根本不指定和保证任何内容,它甚至可能无法编译,而不是 Fortran。看看stackoverflow.com/questions/838310/fortran-90-kind-parameter 看看你应该怎么做,请把这个古老的扩展扔进垃圾箱。
-
您可能还想看看标准 Fortran 处理浮点异常的方式
标签: fortran gfortran fortran95