将大浮点数舍入为整数
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)
中的任何其他方法
在 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)
中的任何其他方法