2012年(158)
分类: C/C++
2012-11-20 09:44:44
float a = 6.7f;
float b = a * 10;
int c = a * 10;
int d =
b;
printf( "%d", c ); // 输出 66
printf( "%d", d ); // 输出 67
在解释结果前,得先了解几个知识点:
1. 即使在表达范围内,浮点数(float、double、long
double)也不能精确表达每一个实数。
比如float可以精确表达67.0f,可以精确表达6.69999980926513671875f,但不能精确表达6.7f。
当不能精确表达时,选择一个最接近的能精确表达的数,比如float以6.69999980926513671875f来表达6.7f。
2.
浮点数计算使用80387数字协处理器,把每一个浮点数载入80bits的临时实数中,进行计算,结果然后再放回。
3.
高精度浮点数转化为低精度浮点数时,使用低精度浮点数能表示的最接近的数;浮点数转化为整型时,直接取整数部分。
于是流程如下:
float a = 6.7f; // a 为 6.69999980926513671875f
float b = a *
10; // 计算结果66.9999980926513671875l 放入 float
中时,变为67.0f,因为67.0f是float能表示的,且最接近66.99……的数。
int c = a * 10; //
计算结果66.9999980926513671875l 取 整数部分 66
int d = b; // 67.0f 取 整数部分
67
可见,差别在于C是由long double直接取整数部分,而d是long double放到float后再取的整数部分,奥妙就在“由long double放到float”这一阶段。