如何将float浮动到上/下表示

时间:2015-03-04 20:22:23

标签: c++ floating-point floating-point-precision

当我计算:

float res = 1.123123123123;

我认为res变量将近似为1.123123123123的最近可能浮点表示。

是否有可能接近可能的下/上浮点表示?

1 个答案:

答案 0 :(得分:1)

你很幸运,你想要它float。大多数编译平台将float映射到IEEE 754二进制32和double到IEEE 754二进制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;

有非常罕见的情况(大多数要求人工制作十进制表示明显是恶意的),上述方法不起作用。它在这些情况下不起作用的原因是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,但我并不完全清楚编译器应该根据动态舍入模式转换浮点常量,即使#pragma STDC FENV_ACCESS ON也是如此