这种情况让我很困惑:我有一个.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程序运行相同的代码,在同一台机器上,给出了正确的结果:
只需查看百分比的结果,精度只会达到7位小数。 Double通常为16位小数。
我有另一个更简单的例子如下:
_outcome等于一些荒谬的数字。但是当我把光标放在“*”的顶部时,它会显示正确的结果。
请帮助,在过去的几天里让我发疯。
更新:问题解决了。 DirectX是罪魁祸首。见:Can floating-point precision be thread-dependent?
答案 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位数。