如何找到两个浮点数之间的最短十进制数
How to find shortest decimal number between two floating point numbers
我想写一个函数,它找到值和最接近的两个浮点值之间的最短小数点,分别是大一点和小点值。
例如,十进制数 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
问题是:给定一个浮点数,有没有办法在数据类型浮点数的精度范围内找到最短的小数?
std::string toShortestDecimal(float value)
{
// ? should return "0.1" for 0.09999999403953552
}
编辑:我正在使用这个转换器。
我目前的想法是从左到右扫描数字以查找第一个差异,然后使用左侧的所有内容作为结果。
例如:
00111111110101000111101011100001 = 1.659999966621399
00111111110101000111101011100010 = 1.6600000858306885
由于我向上移动,我可以保持左起第一个变化数字的 larter,即 6。结果是 1.66 是可能的输出。现在我需要在另一个方向重复这一点。这能保证给出正确的结果吗?
另一个问题是,当指数和尾数都需要更改时,如何将浮点数增加到最近的邻居。
这是一个非常低效的,可能有错误的实现,应该有一个良好的开端:
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++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 浮点数和双精度之间的区别
- 如何以最大精度(C++)将uint64_t转换为0到1之间的双精度/浮点数?
- 新(浮点*)[] 和新浮点数*[] 之间的区别
- 整数/浮点数/字符串值之间的操作,组合太多
- 无法理解浮点数和对象实例化之间比较的原因
- C++11 类型推理如何在浮点数或双精度数之间做出决定
- 如何找到两个浮点数之间的最短十进制数
- 为什么IEEE-754浮点数不能在平台之间交换
- 使用浮点数时,在0和1之间进行归一化是否好
- 测量在算法库中对100万个0到1之间的浮点数进行排序的时间
- 向量类:4个浮点数之间的差异,或4个浮点数的数组
- 整数和浮点数之间的加法…结果是0
- 在windows和linux之间通过c++套接字发送浮点数组
- 在编译时在浮点数和双精度之间切换