Fortranでは、緯度と経度を小数点以下1桁に丸める必要があります。Fortran - 1小数点以下を切り捨てたい
私はのgfortranコンパイラとNINT機能を使用していますが、以下では動作しません -
rlons(i,j) = nint(rla2rlarot*10.0)/10.0
Fortranでは、緯度と経度を小数点以下1桁に丸める必要があります。Fortran - 1小数点以下を切り捨てたい
私はのgfortranコンパイラとNINT機能を使用していますが、以下では動作しません -
rlons(i,j) = nint(rla2rlarot*10.0)/10.0
あなたが求めているものを行うための方法はありません。根本的な問題は、必要な丸められた値が浮動小数点を使って必ずしも表現できないということです。
たとえば、値が10.58だった場合、IEEE754 float32では1.3225000 x 2^3 = 10.580000と正確に表現されます。
これを小数点以下1桁に丸めると、結果は10.6になりますが、10.6には正確な表現がありません。 float32の最も近い表現は1.3249999 x 2^3 = 10.599999です。したがって、丸め処理に関わらず、10.6をfloat32値に正確に格納する方法はなく、浮動小数点値としてnetCDFファイルに書き込む方法はありません。
はい、できます!上の "受け入れられた"答えは、その限られた範囲では正しいですが、あなたが実際にFortran(または他のさまざまなHGL)で達成できるものについては間違っています。
唯一の質問は、F(6.1)での書き込みのようなものが失敗した場合、あなたが支払うべき価格は何ですか?
あなたの問題は、「任意精度」コンピューティングの主題に関して特に些細なバリエーションです。正確に正確に1024ビットの数字を使って "数学"を保存、操作、実行する必要があるときに、暗号化がどのように処理されると思いますか?
この場合の簡単な戦略は、各数値をその構成要素「LHSofD」(10進数の左側)と「RHSofD」値に分けることです。たとえば、RLon(i、j)= 105.591を持ち、netCDF(または通常の)ファイルに105.6(または任意の丸め方法)を印刷したいとします。
...この時点で、一般性を高める選択肢がありますが、ある程度の費用がかかります。この場合、RLonLHS(i、j)= 105、RLonRHS(i、j)= 591に分割します。 "お金"を節約するために、RHSは0.591として保持されるかもしれません(ただし、あなたが好きなことをする必要がある場合は緩やかな一般性)。
簡単にするため、「安く明るい」第2の戦略を想定してください。
LHSは簡単です(Int())。
ここで、RHSの場合、10で乗算します(1 DECに丸めたい場合)。 RLonRHS(i、j)= 5.91に到達し、Fortranの「最も近い整数に近づける」NInt()intrinsicを適用して、RLonRHS(i、j)= 6.0を残します。
...とボブのあなたの叔父:は今、あなたは「双対」を連結し、適切な書き込みステートメントを使用してNetCDFファイルへのLHSとRHSを印刷し、かつ、必要な目標どおりEXACT表現を作成しますOP。
もちろん、後でこれらの値を読み込むことは、読み込みがArbPrecも認識していない限り、上記の同じ問題に戻ります。
...私たちは独自のArbPrecライブラリを書いていますが、VBAや他のHGLでもいくつかのことがあります...しかし、機械の完全なArbPrecビットには注意する必要はありません。とても簡単です。
本当に短い答えは、これを行うことができないということです。浮動小数点表現は不正確であり、使用している浮動小数点型のどの浮動小数点型でも、10で浮動小数点除算が(または小数点以下に丸められて)正確に表現されているという保証はありません。これは印刷または表示専用ですか? – talonmies
@talonmies - いいえ印刷や表示ができません。私は小数点の後に1桁しかない入力netcdfファイルを持っています。私は経度を修正して、それをnetcdfファイルに書き戻したいと思います。 – gansub
これは浮動小数点ではできません。代わりに固定小数点型または小数点型を使用する必要があります – talonmies