B. *_*non 5 c# double resharper mathematical-optimization epsilon
我的项目中有一些代码比较了两个double值,看它们的差异是否超过0,例如:
if (totValue != 1.0)
Run Code Online (Sandbox Code Playgroud)
Resharper对此抱怨,建议我应该使用"EPSILON"并在代码中添加这样的常量(当被邀请时).但是,它不会自己创建常量或建议它应该是什么值.这是一个很好的解决方案:
const double EPSILON = double.Epsilon; // see http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx
. . .
if (Math.Abs(totValue - 1.0) > EPSILON)
compValue = Convert.ToString(totValue*Convert.ToDouble(compValue));
Run Code Online (Sandbox Code Playgroud)
?
我改成了这个:
const double EPSILON = 0.001;
Run Code Online (Sandbox Code Playgroud)
......认为这可能既大又小,足以适用于典型的双重瓦(不是科学的东西,只是"我有2.5个这样的",等等)
不,这对于您的 epsilon 来说不是一个合理的值。您拥有的代码与直接的相等检查没有什么不同。
double.Epsilon是任意两个双打之间可能存在的最小差异。对于任何两个双打来说,除了分开之外,没有其他办法可以让彼此更接近double.Epsilon,因此此检查正确的唯一方法是它们完全相等。
至于您实际应该使用什么 epsilon 值,这只是取决于,这就是为什么不会自动为您生成一个值。这完全取决于您对数据执行的操作类型(这会影响与“真实值”的可能偏差)以及您的应用程序中实际关心的精度(当然,如果您关心的精度大于你的误差幅度,你就有问题了)。您的 epsilon 需要是大于(或等于)您需要的精度的某个精度值,同时小于对任一数值执行的所有操作的可能误差范围。
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |