C# RemoveNoiseFromDoubleMath做什么?
Silverlight工具箱中有以下方法:C# RemoveNoiseFromDoubleMath做什么?,c#,silverlight-toolkit,C#,Silverlight Toolkit,Silverlight工具箱中有以下方法: /// <summary> /// Removes the noise from double math. /// </summary> /// <param name="value">The value.</param> /// <returns>A double without a noise.</returns> interna
/// <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);
}
//
///删除双重数学中的噪波。
///
///价值。
///没有噪音的双人房。
内部静态双RemoveNoiseFromDoubleMath(双值)
{
if(value==0.0 | | Math.Abs((Math.Log10(Math.Abs(value)))<27)
{
返回(双精度)((十进制)值);
}
返回Double.Parse(value.ToString(CultureInfo.InvariantCulture)、CultureInfo.InvariantCulture);
}
我不明白目的是什么,在.Net中做数学双打有噪音吗
从双精度到十进制再到双精度的转换是什么
为什么一个ToString要解析
我编写了一个快速测试项目来生成一些随机数,并通过该方法运行它,但我没有看到任何更改(我并不认为我会看到) 它试图做的是减轻舍入差对浮点运算的影响 如果您以以下代码段为例:
double result = 1.0 / 7.0;
double difference = result - RemoveNoiseFromDoubleMath(result);
Console.WriteLine(difference);
这将产生-138777780145E-16的差值。这试图减轻舍入差对浮点运算的影响 如果您以以下代码段为例:
double result = 1.0 / 7.0;
double difference = result - RemoveNoiseFromDoubleMath(result);
Console.WriteLine(difference);
这会产生-138777780145E-16的差异。这个函数有一个注释块,实际上没有解释它试图处理的“噪音”是什么,以及它如何影响值,这真是太棒了 按照我的理解,如果数字少于27个10进制数字(或者正好是零),它会被转换成十进制,然后返回到双精度。我本以为转换为十进制应该对该值没有影响,因为十进制的分辨率大于双精度。再次转换回双精度应该是无损的 Pieter的例子表明,这个操作实际上似乎确实会影响值,因此从double到decimal再到back的转换显然不是保值的,即使它们可能是保值的。查看msdn,我看到以下内容: 上面说: 将float或double转换为 十进制,则转换源值 以十进制表示并四舍五入 到28号以后最近的号码 小数点(如果需要) 好吧,就这样吧。这意味着,如果您有一个值为1.99999999999999999999999999的双精度浮点,则转换为十进制将使其四舍五入为2,因此当它转换回双精度浮点时,您将得到一个值正好为2.0的双精度浮点
如果数字超过27位,则会将其转换为字符串,然后进行解析。我不确定最终的结果是什么-这将取决于ToString和Double.parse的默认行为。这个函数有一个注释块,实际上没有解释它试图处理的“噪音”是什么,以及它如何影响值,这真是太棒了 按照我的理解,如果数字少于27个10进制数字(或者正好是零),它会被转换成十进制,然后返回到双精度。我本以为转换为十进制应该对该值没有影响,因为十进制的分辨率大于双精度。再次转换回双精度应该是无损的 Pieter的例子表明,这个操作实际上似乎确实会影响值,因此从double到decimal再到back的转换显然不是保值的,即使它们可能是保值的。查看msdn,我看到以下内容: 上面说: 将float或double转换为 十进制,则转换源值 以十进制表示并四舍五入 到28号以后最近的号码 小数点(如果需要) 好吧,就这样吧。这意味着,如果您有一个值为1.99999999999999999999999999的双精度浮点,则转换为十进制将使其四舍五入为2,因此当它转换回双精度浮点时,您将得到一个值正好为2.0的双精度浮点
如果数字超过27位,则会将其转换为字符串,然后进行解析。我不确定最终的结果是什么-这将取决于ToString和Double.parse的默认行为。这是有意义的,因为工具箱正在使用双重计算的方法:ValueHelper.RemoveNoiseFromDoubleMath(ValueHelper.RemoveNoiseFromDoubleMath(Math.Floor(typedValue/typedInterval))*typedInterval);这是有意义的,因为工具箱使用的是双重计算方法:ValueHelper.RemoveNoiseFromDoubleMath(ValueHelper.RemoveNoiseFromDoubleMath(Math.Floor(typedValue/typedInterval))*typedInterval);