如何将float舍入为上/下表示
How to round float to the upper/lower representation
当我计算时:
float res = 1.123123123123;
我假设res变量将近似于1.123123123123的最接近的可能浮点表示。
是否可以近似于可能的下限/上限浮动表示?
您很幸运,希望它成为float
。大多数编译平台将float
映射到IEEE 754二进制32,将double
映射到IEEE 752二进制64,在绝大多数情况下,您都可以使用以下C语法获得正确答案:
double d = 1.123123123123;
#pragma STDC FENV_ACCESS ON
int save_round = fegetround();
fesetround(FE_DOWNWARD); // should be checked ideally
float f = d;
fesetround(save_round);
如果你想对double
做同样的事情,你可以用long double
作为中间值,只要long double
在你的平台上比double
宽,记住把常数写为long double ld = 1.123123123123L;
在极少数情况下(大多数情况下,要求人类在明显不诚实的情况下制作十进制表示),上述方法不起作用。在这些情况下,它不起作用的原因是双舍入。另一方面,如果您的编译平台在提供IEEE 754格式和操作方面做得很好(根据后者的原则,从十进制到二进制的转换应该遵循舍入模式),那么下面的代码段在所有情况下都有效:
#pragma STDC FENV_ACCESS ON
int save_round = fegetround();
fesetround(FE_DOWNWARD);
float f = strtof("1.123123123123");
fesetround(save_round);
在纯理论中,您甚至可能不需要调用strtof
,但我并不完全清楚编译器是否应该根据动态舍入模式转换浮点常量,即使使用#pragma STDC FENV_ACCESS ON
也是如此。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中
- 避免将 Int 转换为双重类型转换舍入
- 浮点数学运算后舍入不一致
- 浮动到绳子而无需舍入
- C++长双精度格式而不舍入
- 如何将float舍入为上/下表示
- c++内部可以表示的0到1之间不舍入的最大和最小的数是什么?