c++ - 如何在两个 float 之间找到最短的十进制数

标签 c++ floating-point-conversion

我想编写一个函数,在值和最近的两个分别较大和较小的浮点值之间找到最短的小数。

例如十进制数0.1有

decimal representation: 0.1
binary representation: 0 01111011 10011001100110011001101
actual value of binary representation: 0.10000000149011612

可以通过将二进制表示的最后一个 1 切换为零来获得下一个更小的浮点值:

binary: 00111101110011001100110011001100
value: 0.09999999403953552

下一个较大的浮点值:

binary: 00111101110011001100110011001101
value: 0.10000000149011612

问题是:给定一个float,有没有办法在float数据类型的精度范围内找到最短的小数?

std::string toShortestDecimal(float value) 
{  
   // ? should return "0.1" for 0.09999999403953552
}

编辑:我正在使用 this converter .

我目前的想法是从左到右扫描数字以获得一阶差分,然后使用左边的所有内容作为结果。

例如:

00111111110101000111101011100001 = 1.659999966621399
00111111110101000111101011100010 = 1.6600000858306885

因为我向上移动,所以我可以保留左边第一个变化数字中较晚的一个,即 6。结果是 1.66 是一个可能的输出。现在我需要在另一个方向重复这个。这能保证给出正确的结果吗?

另一个问题是当指数和尾数都需要改变时如何将 float 递增到它最近的邻居。

最佳答案

这是一个非常低效的、可能有问题的实现,应该是一个好的开始:

template<class T>
std::string convert(T value, int precision) {
    std::stringstream ss;
    ss << std::setprecision(100) << value;
    return ss.str();
}

template<class T>
std::string find_shortest(T value) {
    auto lower = convert(std::nextafter(value, -std::numeric_limits<T>::infinity()), 100);
    auto higher = convert(std::nextafter(value, std::numeric_limits<T>::infinity()), 100);

    int diff_idx = 0;
    while (lower[diff_idx] == higher[diff_idx]) ++diff_idx;
    lower = lower.substr(0, diff_idx+1);
    higher = higher.substr(0, diff_idx+1);
    if (std::abs(std::stod(lower.c_str()) - value) < 
        std::abs(std::stod(higher.c_str()) - value)) return lower;
    return higher;
}

关于c++ - 如何在两个 float 之间找到最短的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29049589/

相关文章:

c++ - 代码正在打印对象的内存位置而不是对象本身

c++ - 全局 Hook 在 Visual C++ 中不起作用

c++ - 为什么 C++ 析构函数会影响返回值优化的行为

c - nesC:将 float 转换为整数

c++ - 带有整数参数的 std::pow,与整数类型进行比较

c++ - 将 C++ 双缓冲区传递给 Node Js(直接)[Node JS : V8 c++ : Nan]

c++ - 如何在 std::cout 中既不以科学形式也不以定点表示法输出 float ?

python - 生成大量唯一的随机 float32 数字

python - 将字符串总和打印为 float

lua - 使用 LUA 解码 UDP 消息