繁体   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