在Fortran中,我希望能够将一个大的双精度浮点数舍入到最接近的整数。我尝试如下,
PROGRAM rounding
IMPLICIT NONE
INTEGER, PARAMETER :: DP = 8
REAL(KIND=DP) :: value
value = 12345678987.123456
print *, CEILING(value)
END PROGRAM ROUNDING
但是,这不会输出正确的答案,而是提供-2147483648
。我理解这与浮点的性质和精度有关,但是对这样的数字进行舍入似乎是一个合理的目标。
有人能指出我正确的方向吗?
答案 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)
中的任何其他方法