将大浮点数舍入为整数

Rounding large floats to integer

在 Fortran 中,我希望能够将大型双精度浮点数舍入为最接近的整数。我尝试如下,

PROGRAM rounding
IMPLICIT NONE
INTEGER, PARAMETER :: DP = 8
REAL(KIND=DP) :: value

value = 12345678987.123456

print *, CEILING(value)

END PROGRAM ROUNDING 

然而,这并没有输出正确答案,而是给出了-2147483648。我明白这与浮点的性质和精度有关,但像这样对数字进行四舍五入似乎是一个合理的目标。

谁能给我指出正确的方向?

ceiling() 返回的整型变量太小,无法容纳该值。你必须告诉 ceiling 产生一个更大的整数。否则它使用默认整数。

例如

print *, CEILING(value, kind=dp)

(假设存在这种类型,但它应该存在,如果 DP 被 select 明智地编辑)

请注意 kind=8 丑陋且不可移植。您不应使用 8 等文字常量。不能保证任何此类存在。

所以我会使用:

INTEGER, PARAMETER :: DP = kind(1.d0)

对于整数类型,您可以使用 SELECTED_INT_KIND 到 select 具有足够数字的类型,例如

INTEGER, PARAMETER :: IP = SELECTED_INT_KIND(15)

print *, CEILING(value, kind=IP)

或使用 Fortran: integer*4 vs integer(4) vs integer(kind=4)

中的任何其他方法