1

FORTRAN には、倍精度数を整数値に変換する関数がいくつか用意されています。切り捨て/丸めの方法が異なります。これらを使用する複雑な科学アルゴリズムを変換しています。

FORTRAN のドキュメントによると、
aint(x)は、x と 0 の間の最も近い x の整数値を返します。
anint(x)は、xに最も近い整数値を返します。ただし、途中の場合は、より大きな整数値に丸められます。
nint(x)は、x を最も近い int 値に丸める int 形式に変換します。

これらを C# で実装している人はいますか? 正解するのは難しいかもしれません。

(int)x は aint() と一致するように見えます
Convert.ToInt32(x) は上記のいずれとも一致しません。
Trunc(x) は上記のいずれとも一致しません。
Round(x) は anint または nint に一致する可能性があります。

anint と nint の違いは戻り値の型にあるようです。anint は倍精度値を返しますが、nint は整数を返します。両方が使用されます (実際のサンプル):
DOUBLE PRECISION A、B、C、D、E、F、G
... ここで設定される値 ...
F = ANINT(AB) + ANINT(CD) + ANINT(B+DE)
G = NINT(F) + 1D0;
おそらく、FORTRAN の専門家は、作成者が両方を使用することを選択した理由を明確にするのに役立つ可能性があります (意図的なものだと思います)。

4

3 に答える 3

3

呼び出しの定義から、を使用しnintanint提供されます。Math.RoundMidpointRounding.AwayFromZero

の場合、からへaintの明示的なキャストはその結果を達成します。doubleint

于 2008-10-29T15:08:59.973 に答える
1

私が見ることができるものから、aint()ちょうどMath.Floor().

他の 2 つについては、唯一の違いは戻り値の型であるということは正しいと思います。nint()実際の整数をanint()返しますが、たまたま整数値を持つ double (fortran: real) を返します。

于 2008-10-29T15:12:12.370 に答える
0

関数 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;
}
于 2013-07-02T13:26:15.420 に答える