如何将 float 舍入为 upper/lower 表示

How to round float to the upper/lower representation

当我计算时:

float res = 1.123123123123;

我想 res 变量将近似于 1.123123123123 的最接近的浮点表示形式。

是否可以近似于 lower/upper 可能的浮点表示?

你很幸运,你想要它作为 float。大多数编译平台将 float 映射到 IEEE 754 binary32 并将 double 映射到 IEEE 754 binary64,在绝大多数情况下,您可以获得正确的答案,在 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 doubledouble 宽在您的平台上,并记住将常量写为 long double ld = 1.123123123123L;

在极少数情况下(大多数情况下需要人工制作十进制表示是明显的恶意)上述方法不起作用。它在这些情况下不起作用的原因是 double-rounding。另一方面,如果您的编译平台在提供 IEEE 754 格式和操作方面做得非常好(根据后者的原则,从十进制到二进制的转换应该遵循舍入模式),下面的代码片段在所有情况下都适用:

#pragma STDC FENV_ACCESS ON
int save_round = fegetround();
fesetround(FE_DOWNWARD);
float f = strtof("1.123123123123");
fesetround(save_round);

纯理论上,你甚至可能不需要调用strtof,但我不完全清楚编译器应该根据动态舍入模式转换浮点常量,即使[=21] =].