【发布时间】:2018-02-14 10:11:41
【问题描述】:
以下代码传递了一个 64 位浮点数(双精度),并在将该值传递给 API 之前将其缩减为 32 位单精度。
real*8 z
real*4 z1
z1 = real(z)
在 z 的某些值上,我们得到一个例外;
收到 SIGFPE:发生算术异常
我使用调试器输出 z 中的值,结果是 -1.1889755140229473e+044,所以这显然是问题所在。
我认为real(z) 会将此值截断为单精度,但不会出错。 如何将这个 64 位双精度无异常转换为 32 位单精度?
这是来自以前在 Silverfrost Fortran 32 位下编译的现有代码库,现在是 gfortran 64 位。将整个调用堆栈转换为单精度来解决它可能是不可能的。
【问题讨论】:
-
你能提供z的具体有问题的值吗?
-
请参阅en.wikipedia.org/wiki/Single-precision_floating-point_format 了解最大 32 位浮点值(绝对值 ≈ 3.402823e+38),并查看有关处理浮点溢出的编译器文档。
-
@PierredeBuyl 上面提到了一个值 (-1.1889755140229473e+044)。
-
演员本身只是用 gfortran(4、5 和 7、64 位 linux 系统)返回“Infinity”
-
@PierredeBuyl 有同样的问题,但在消息中:“z 原来是 -1.1889755140229473e+044”