让我在我的应用程序中将步长设置为0.1。 因此,无论我得到什么fp值,我都只需要在逗号后面加上一位数字即可。
因此,47.93434
必须为47.9
(或至少是最接近的fp可表示值)。
如果我这样写:
double value = 47.9;
它正确地“捕捉”到了可以获取的最接近的fp值,即:
47.89999999999999857891452847979962825775146484375 // fp value
101111.11100110011001100110011001100110011001100110011 // binary
现在,假设“我不写那些值”,但是我是从软件中获得的。 而且比我需要抢购它。我写了这个函数:
inline double SnapValue(double value, double step) {
return round(value / step) * step;
}
但是它返回这些值:
47.900000000000005684341886080801486968994140625 // fp value
101111.11100110011001100110011001100110011001100110100 // binary
在形式上与第一个示例稍有不同(其“ next” fp值011 + 1
)。
您将如何获得每个输入值的第一个值(“更正确”)?
Here's测试代码。
注意:步骤可以不同-即step = 0.25
需要将值捕捉到最接近的0.25 X附近。例如:步骤0.25
将返回值为{{ 1}},0
,0.25
,0.50
,0.75
,1.0
等。因此,在输入1.25
的情况下,需要包装到最接近的捕捉值-即1.30
。
答案 0 :(得分:1)
您可以尝试使用有理数而不是浮点数。后者通常已经不准确,因此并不是一步的理想选择。
inline double snap(double original, int numerator, int denominator)
{
return round(original * denominator / numerator) * numerator / denominator;
}
假设您要以0.4为步长,然后使用2/5:
snap(1.7435, 2, 5) = round(4.35875) * 2 / 5 = 4 * 2 / 5 = 1.6 (or what comes closest to it)