当我计算:
float res = 1.123123123123;
我认为res变量将近似为1.123123123123的最近可能浮点表示。
是否有可能接近可能的下/上浮点表示?
答案 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
也是如此