Jam*_*ing 5 .net floating-point
如何确定一个浮点数是否是另一个浮点数的倍数?
例如 500.4 是 0.001 的倍数吗?
double v = 500.4;
double multipleOf = 0.001;
double remainder = v % multipleOf;
// 0.000999999999966846
Run Code Online (Sandbox Code Playgroud)
为了性能,我不想将双精度数转换为小数。鉴于浮点数学的不精确性,我该如何测试这一点?
您将确定 是否remainder低于您的问题的可接受容差,或者是否remainder非常接近您的multipleOf:
if (Math.Abs(remainder) < tolerance)
{
//remainder is negligible so we'll say it's a multiple
}
else if (Math.Abs(multipleOf) - Math.Abs(remainder) < tolerance)
{
//remainder is almost multiple of divisor so we'll say it's a multiple
}
Run Code Online (Sandbox Code Playgroud)
只有您可以决定一个足够小的容差值。有时机器 epsilon用于此类检查,但它可能太低。如果v非常大和multipleOf非常小,我们可能会说问题是病态的,因为容差可能需要很高,结果对于您应用程序中所需的精度水平来说是无用的。因此,寻找调节和精确度可能也会引起人们的进一步兴趣。
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |