[英]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.