簡體   English   中英

RemoveNoiseFromDoubleMath有什么作用?

[英]What does RemoveNoiseFromDoubleMath do?

在Silverlight工具包中,有以下方法:

    /// <summary>
    /// Removes the noise from double math.
    /// </summary>
    /// <param name="value">The value.</param>
    /// <returns>A double without a noise.</returns>
    internal static double RemoveNoiseFromDoubleMath(double value)
    {
        if (value == 0.0 || Math.Abs((Math.Log10(Math.Abs(value)))) < 27)
        {
            return (double)((decimal)value);
        }
        return Double.Parse(value.ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture);
    }

我不明白目的是什么,在.Net中進行數學運算是否會產生兩倍的噪音?

將double轉換為十進制到double是什么?

為什么要使用ToString進行解析?

我編寫了一個快速測試項目,以生成一些隨機數並通過該方法運行它,但是我沒有看到任何更改(不是我以為可以)。

這樣做的目的是減輕舍入到浮點算法的舍入差異。

例如,如果您使用以下代碼段:

double result = 1.0 / 7.0;

double difference = result - RemoveNoiseFromDoubleMath(result);

Console.WriteLine(difference);

這產生了-1,38777878078145E-16的差。

真棒,這個函數有一個注釋塊,它實際上並不能解釋它實際上要處理的“噪聲”是什么,以及它如何影響值。

我的閱讀方式是,如果數字的位數少於27個10位數字(或恰好為零),則將其轉換為十進制,然后再轉換為雙精度。 我本來希望轉換為十進制應該對值沒有影響,因為十進制的分辨率大於double。 轉換回兩倍應該再次是無損的。

Pieter的示例顯示此操作實際上確實會影響該值,因此,從雙精度到十進制再向后的轉換顯然並不能保持值,即使有可能。 調查msdn,我看到這樣的情況: http : //msdn.microsoft.com/zh-cn/library/yht2cx7b( v=VS.80) .aspx

其中說:

將float或double轉換為十進制時,源值將轉換為十進制表示形式,並根據需要四舍五入為小數點后28位之后的最接近的數字。

好吧,它四舍五入。 這意味着,如果您有一個值為1.99999999999999999999999999999999的雙精度數,則轉換為十進制會將其舍入為2,因此當將其轉換回雙精度數時,您將得到一個正好為2.0的雙精度數。

如果數字的位數超過27位 ,則將其轉換為字符串,然后進行解析。 我不確定這樣做的最終結果是什么-它取決於ToString和Double.parse的默認行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM