0

過去 2 日間、私は 10 進数と 2 倍の丸めについて多くのことを読んできました。

私が知りたいのは、Math.Round が実際に内部でどのように機能するかを知っている人はいますか? ビットに変換してからそれらのビットを丸めますか、それとも最初に丸めますか? 丸めを行うネイティブ コードをインポートまたは実行しますか? 等

誰かが技術的なホワイトペーパーやリンクを持っていれば、それは素晴らしいことです!

4

1 に答える 1

1

逆コンパイラを使用して mscorlib.dll から取得。他にも重要な呼び出しが多数あることに注意してください。逆コンパイラを入手して、自分でステップ実行することをお勧めします。乾杯

[__DynamicallyInvokable]
[SecuritySafeCritical]
public static extern double Round(double a);

[__DynamicallyInvokable]
public static double Round(double value, int digits)
{
    if (digits < 0 || digits > 15)
    {
        throw new ArgumentOutOfRangeException("digits", Environment.GetResourceString("ArgumentOutOfRange_RoundingDigits"));
    }
    return Math.InternalRound(value, digits, MidpointRounding.ToEven);
}


[SecuritySafeCritical]
private static double InternalRound(double value, int digits, MidpointRounding mode)
{
    unsafe
    {
        if (Math.Abs(value) < Math.doubleRoundLimit)
        {
            double num = Math.roundPower10Double[digits];
            value = value * num;
            if (mode != MidpointRounding.AwayFromZero)
            {
                value = Math.Round(value);
            }
            else
            {
                double num1 = Math.SplitFractionDouble(ref value);
                if (Math.Abs(num1) >= 0.5)
                {
                    value = value + (double)Math.Sign(num1);
                }
            }
            value = value / num;
        }
        return value;
    }
}
于 2013-11-01T06:06:34.277 に答える