如何将float舍入为上/下表示

How to round float to the upper/lower representation

本文关键字:表示 舍入 float      更新时间:2023-10-16

当我计算时:

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也是如此。