在過去的兩天裏,我一直在做大量的關於舍入的十進制和雙精度讀數。C#的技術分析Math.Round
我想知道的是沒有人知道Math.Round實際上是如何工作的?它是否會轉換爲位,然後對這些位進行四捨五入,或者先輪到它?它是否導入或執行任何執行四捨五入的本機代碼? etc
如果任何人有任何技術白皮書或鏈接,這將是太棒了!
在過去的兩天裏,我一直在做大量的關於舍入的十進制和雙精度讀數。C#的技術分析Math.Round
我想知道的是沒有人知道Math.Round實際上是如何工作的?它是否會轉換爲位,然後對這些位進行四捨五入,或者先輪到它?它是否導入或執行任何執行四捨五入的本機代碼? etc
如果任何人有任何技術白皮書或鏈接,這將是太棒了!
使用反編譯功能從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;
}
}
我剛剛使用JustDecompile對Math.Round進行了反編譯,我注意到了一個初始的Round方法聲明標記爲extern。據我所知,這意味着該方法是外部實現的,你知道Round方法來自哪個庫嗎? – h4ck3r8ug5
看看這裏http://stackoverflow.com/questions/8870442/how-is-ma-pow-implemented-in-net-framework雖然它談論的POW也適用於Round。 – Nico
閱讀[源代碼(http://www.dotnetframework.org/default.aspx/Net/Net/[email protected]@[email protected]/DEVDIV/depot/DevDiv/releases/whidbey/ netfxsp/NDP/CLR/SRC/BCL /系統/數學@ CS/1 /數學@ CS)。 –
如果你得到IL間諜,反編譯DLL並尋找你自己。 –