你如何正确地";"啪"的一声;到一个值

How do you properly "snap" to a value?

本文关键字:quot 一声 一个 正确地      更新时间:2023-10-16

假设我在应用程序中设置了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

这在形式上比第一个示例稍远(它的"下一个"fp值011 + 1)。

如何获得每个输入值的第一个值("更正确")?

这是测试代码。

注意:步长可以不同-即step = 0.25需要捕捉到最接近的0.25X附近的值。示例:0.25的步长将返回值为00.250.500.751.01.25等。因此,给定1.30的输入,它需要包装到最接近捕捉的值,即1.25

您可以尝试使用有理值而不是浮点值。后者往往已经不准确了,所以并不是一个理想的匹配步骤。

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)