浮点数上溢、下溢
什么是上溢?
数据大于当前定义类型的范围,导致出现异常数据的现象。
(当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。)
例子1
在我电脑中float类型的长度是4个字节,数值范围为 -3.4E+38 到3.4E+38。
#include <stdio.h>
int main(void)
{
float a, b;
a = 3.4E38;
b = 3.4E38 * 100.0f; // float 的数值范围: -3.4E+38 到3.4E+38
printf("a = %e\n",a); // float 最大值
printf("b = %e\n",b); // 超过最大值
return 0;
}
通过给float类型变量赋值,可以看出当数值超过定义类型的范围时,就会出现上溢。而现在C语言规定,在这种情况下会给float类型变量赋一个无穷大的特定值,如图所示。
什么是下溢?
以一个十进制为例,把一个有4位有效数字的数(如,0.1234E-10)除以10,得到的结果为:0.0123E-10.虽然得到了结果,但是在计算过程中丢失了原末尾有效位尚的数字,这种情况叫做下溢。
例子
#include <stdio.h>
int main(void)
{
float c, d;
c = 1.4E-45;
d = 1.4E-45 / 2;
printf("c = %e\n",c);
printf("d = %e\n",d);
}
C语言把损失类型全精度的浮点值称为低于正常的浮点值,因此把最小的浮点数除以2会得到一个低于正常的值。