着手解决练习2.1来自" C编程语言"一个人应该在本地机器上计算不同类型的范围,如char,short,int等,还可以浮动和加倍。通过除浮动和双重之外的所有内容我会注意溢出发生,因此可以计算最大/最小值。然而,通过浮动,这仍然无法正常工作。
所以,问题是为什么这段代码两次打印相同的值?我认为第二行应该打印inf
float f = 1.0;
printf("%f\n",FLT_MAX);
printf("%f\n",FLT_MAX + f);
答案 0 :(得分:5)
尝试乘以10,如果会溢出。它没有溢出的原因与为一个已经非常大的浮点数添加一个小浮点数实际上根本没有改变它的原因相同 - 它是一个浮点格式,这意味着数字的位数精度有限。
或者,至少添加最后一位有效数字可能会有效:
float f = 3.402823e38f; // FLT_MAX
f = f + 0.000001e38f; // this should result in overflow
答案 1 :(得分:2)
两次打印相同值的原因是1.0
太小而无法添加到FLOAT_MAX
。 float
尾数通常为24位,指数为8位。如果指数为127的值非常大,则需要一个至少127位的尾数才能添加1.0
。
例如,十进制(和任何其他)指数值存在同样的问题: 如果您的数字有3位有效数字,例如1.00 * 10 6 ,则不能加1,因为这将是1' 001' 001,这需要6有效数字。
您可以通过重复加倍值来溢出float
。