C#でのFORTRAN丸めの一致
-
05-07-2019 - |
質問
FORTRANは、倍精度数を整数値に変換するためのいくつかの関数を提供します。切り捨て/丸めに使用される方法は異なります。これらを使用する複雑な科学アルゴリズムを変換しています。
FORTRANのドキュメントによると:
aint(x)は、xに最も近いxと0の間の整数値を返します。
anint(x)はxに最も近い整数値を返しますが、途中の場合は例外です
大きさが大きい整数値に丸められます。
nint(x)は、xを最も近いint値に丸めてint形式に変換します。ただし、
途中の場合は、大きさが大きいint値に丸められます。
C#でこれらの実装を持っている人はいますか? 正しくするのは難しいかもしれません。
(int)xはaint()
と一致するようです
Convert.ToInt32(x)は上記のいずれにも一致しません。
Trunc(x)は上記のいずれにも一致しません。
Round(x)はanintまたはnintと一致する場合があります。
anintとnintの違いは戻り型のようです。anintは倍精度値を返しますが、nintは整数を返します。両方が使用されます(実際のサンプル):
倍精度A、B、C、D、E、F、G
...ここで設定する値...
F = ANINT(A-B)+ ANINT(C-D)+ ANINT(B + D-E)
G = NINT(F)+ 1D0;
おそらくFORTRANの専門家は、著者が両方を使用することを選択した理由を明確にするのに役立つかもしれません(私はそれが意図的であると仮定しています)。
解決
呼び出しの定義から、 nint
および anint
は Math.Roundによって提供されます
MidpointRounding.AwayFromZero
を使用します。
aint
の場合、 double
から int
への明示的なキャストでその結果が得られます。
他のヒント
見ると、 aint()
は単なる Math.Floor()
です。
他の2つについては、唯一の違いは戻り型であると思います。 nint()
は実際の整数を返しますが、 anint()
はdouble(fortran:real)は、たまたま整数値を持っています。
関数anintの実装があります。コードに従ってください:
double anint(double x)
{
int a;
double y;
a = (int)x; //a=9
if (10 * x - 10 * (double)a >= 5)
{
a = a + 1;
}
y = (double)a;
return y;
}