gpt4 book ai didi

c++ - 你如何正确地将 "snap"设为一个值?

转载 作者:行者123 更新时间:2023-11-30 04:52:39 25 4
gpt4 key购买 nike

假设我在我的应用程序中设置了 0.1 步长。所以,无论我得到什么 fp 值,我只需要逗号后的 1 位数字。

所以,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)有点远。

如何为每个输入值获取第一个值(“更正确”)?

Here's测试代码。

注意:步骤可以不同 - 即 step = 0.25需要在最接近的 0.25 X 附近对齐值。示例:0.25 的一个步骤将返回值为 0 , 0.25 , 0.50 , 0.75 , 1.0 , 1.25等等。因此,给定输入 1.30 ,它需要换行到最接近的捕捉值 - 即 1.25 .

最佳答案

您可以尝试使用有理数而不是 float 。后者通常已经不准确,因此并不是真正理想的步骤匹配。

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)

关于c++ - 你如何正确地将 "snap"设为一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54255093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com