将大浮点数舍入为整数

时间:2017-08-14 14:19:04

标签: floating-point fortran rounding gfortran

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

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

value = 12345678987.123456

print *, CEILING(value)

END PROGRAM ROUNDING 

但是,这不会输出正确的答案,而是提供-2147483648。我理解这与浮点的性质和精度有关,但是对这样的数字进行舍入似乎是一个合理的目标。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

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

例如

print *, CEILING(value, kind=dp)

(假设存在这样的种类,但如果明智地选择了DP则应该存在)

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

所以我会用:

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

对于整数种类,您可以使用SELECTED_INT_KIND选择具有足够数字的种类,例如

INTEGER, PARAMETER :: IP = SELECTED_INT_KIND(15)

print *, CEILING(value, kind=IP)

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

中的任何其他方法