.NET中错误的浮点数计算

时间:2014-02-13 15:04:14

标签: .net math floating-point

这种情况让我很困惑:我有一个.NET应用程序正在进行浮点数计算。看分,Math.Pow和Math.Exp似乎有问题。例如:

double _E1 = 20616579.5;
double sub = 19000;
double total = 19623;
double percent = sub / total;                 //0.96825152635574341
double _result1 = Math.Pow(_E1, percent);     //12078177.0
double _result2 = Math.Exp(percent * Math.Log(_E1)); //12078184.730266357   

所有三个结果,百分比,_result1和_result2都不正确(您可以使用计算器进行验证)。

我有另一个.NET程序运行相同的代码,在同一台机器上,给出了正确的结果:

  • _result1 = 12078180.370260473
  • _result2 = 12078180.370260468
  • 百分比= 0.96825154155837534

只需查看百分比的结果,精度只会达到7位小数。 Double通常为16位小数。

我有另一个更简单的例子如下: enter image description here enter image description here

_outcome等于一些荒谬的数字。但是当我把光标放在“*”的顶部时,它会显示正确的结果。

请帮助,在过去的几天里让我发疯。

更新:问题解决了。 DirectX是罪魁祸首。见:Can floating-point precision be thread-dependent?

2 个答案:

答案 0 :(得分:1)

您的完全代码无法编译(您已声明两次percent)。我怀疑在其他地方有一个你没有发布的转换(可能转换到float某处会将精度降低到6-7位)。

当我在LinqPad中运行你的代码(减去percent的额外声明)时,我得到了正确的结果:

void Main()
{
    double _E1 = 20616579.5;
    double sub = 19000;
    double total = 19623;
    double percent = sub / total;                 
    double _result1 = Math.Pow(_E1, percent);     
    double _result2 = Math.Exp(percent * Math.Log(_E1));  

    percent.Dump();     // 0.968251541558375
    _result1.Dump();    // 12078180.3702605
    _result2.Dump();    // 12078180.3702605
}

答案 1 :(得分:0)

Double只有15-16位的精度。我认为这是你得到错误的地方。

尝试使用十进制(http://msdn.microsoft.com/en-us/library/364x0z75.aspx)代替。可以处理28-29位数。