2017-08-14 19 views
1

Fortranでは、大きな倍精度浮動小数点数を最も近い整数に丸めることができるようにしたいと考えています。次のように私は大きな浮動小数点を整数に丸める

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

value = 12345678987.123456 

print *, CEILING(value) 

END PROGRAM ROUNDING 

はしかし、これは出力正解しませんが、代わりに-2147483648を与え、これを試みます。私はこれが浮動小数点の性質と精度に関連していることに感謝しますが、このような数値を四捨五入するのは妥当な目標です。

誰でも正しい方向に向けることができますか?

+0

マイナーから他のメソッドを使用するように十分な桁種類を選択するために、SELECTED_INT_KINDを使用することができ整数種類について注: 'value'が倍精度の場合、' value = 12345678987.123456_dp'と書く方が良いでしょう。 '_dp'がなければ、単一の精度の数値を' value'に代入しており、いくつかの数字は失われます。あなたの場合、結果の整数の差は '12345678848'対' 12345678988'です。 –

答えて

1

ceiling()によって返される整数変数は、値を格納するには小さすぎます。天井に大きな種類の整数を生成するように指示する必要があります。それ以外の場合は、デフォルトの整数が使用されます。

print *, CEILING(value, kind=dp) 

DPが賢明選択された場合、そこにそのような種類の存在が、それが存在しなければならないと仮定して)

によって例えば

kind=8は醜いとポータブルでないことに注意してくださいは。 8などのリテラル定数は使用しないでください。そのような種類が存在するという保証はありません。

だから私は使用します。

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

あなたは

INTEGER, PARAMETER :: IP = SELECTED_INT_KIND(15) 

print *, CEILING(value, kind=IP) 

またはFortran: integer*4 vs integer(4) vs integer(kind=4)

+0

元の質問は '最も近い整数'を求めます。これは 'CEILING'よりも' NINT'に似ています。しかし、重要な部分である答えの残りは正しいです。 – Ross

関連する問題