你如何正确地";"啪"的一声;到一个值
How do you properly "snap" to a value?
假设我在应用程序中设置了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
的步长将返回值为0
、0.25
、0.50
、0.75
、1.0
、1.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)
相关文章:
- 使用strcpy将char数组的元素复制到另一个数组
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在 c++ 中拥有一组结构的正确方法是什么?
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- nlohmann-json将一个数组插入到另一个数组中
- 有没有一种方法可以在编译时获得作用域类名
- 为什么make_tie不是一件事
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- MacOS通过在莫哈韦"wchar.h"下破碎的自制啤酒发出叮当声
- c++中O(n^(1/3))中一个数的除数的有效计数
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 你如何正确地";"啪"的一声;到一个值
- Objective-C, CoreAudio:播放的声音有额外的噪音,嘶嘶声和砰的一声的可能原因