您如何正确地“捕捉”到一个值?

时间:2019-01-18 13:31:50

标签: c++ floating-point floating-accuracy

让我在我的应用程序中将步长设置为0.1。 因此,无论我得到什么f​​p值,我都只需要在逗号后面加上一位数字即可。

因此,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}},00.250.500.751.0等。因此,在输入1.25的情况下,需要包装到最接近的捕捉值-即1.30

1 个答案:

答案 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)