Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RemoveNoiseFromDoubleMath做什么?_C#_Silverlight Toolkit - Fatal编程技术网

C# RemoveNoiseFromDoubleMath做什么?

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

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);
    }
//
///删除双重数学中的噪波。
/// 
///价值。
///没有噪音的双人房。
内部静态双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);