1.+0 和 -0
阶码全为0尾数全为0,正负由符号位决定
2.+∞和-∞
阶码全为1,尾数全为0,正负由符号位决定
3.非规格化数
阶码全为0,尾数非0
顺带解释,为什么要有非规格化数
大家知道浮点数是有隐藏位“ 1 ”的
然后,浮点数的计算会有1. XXX * 2^n
那怎么表示0呢???
这里就需要有非规格化数了
因为阶码全为0的非规格化数的隐藏位是“ 0 ”,这时就可以处理 0 的问题了!
Ps:阶码为0时,阶码的真值不再是0-127=-127,而是IEEE754规定的-126,承接规格化数的最小阶码真值(1-127=-126)
这里顺带引出所谓的规格化数
也就是
阶码非0,且阶码不全为1
这里看一下规格化数的最小值
根据语法,阶码的最小值为1
1-127=-126
则有最小的规格化数1.0*2^-126
你会发现这个数字要比非规格化数要大
所以说,非规格化数还用于处理比规格化数更小的数值
综上:
非规格化数有两个作用:
1.处理 0 的问题
2.处理比规格化数更小的数值
4.NaN(Not a Number)
阶码全为1,尾数非0
NaN也叫非数,用于定义异常数据
下面我拿C++举一个例子
我拿 0 作了分母
#include<iostream>
using namespace std;
int main()
{
double a=0;
double b=0/a;
cout<<b;
return 0;
}
输出结果:
再让我们看看这个非数b 内存中的情况
转化成二进制
1 11111111 10000000000000000000000
非数定义,阶码全为1,尾数非0
所以,看到非数的时候,就说明你的程序在运算时出现了这样类似的错误哦!
Ps: ind——indeterminate 不确定的
关于输出不是NaN,是不同编译器处理方式略有不同的缘故
上面我用的是VS2012,原因是当初学C的时候就是用的这个,比较熟悉
后来我去Dev跑了同一段程序,然后就输出了非数
(注意:int 型的分母0在编译阶段就报错了,要浮点数而且分母得要是变量)
顺带给大家看一下我在Java实验的结果
也输出了NaN
综上:
NaN, 非数,定义异常数据