浮点数
C++中共有3种浮点类型:float、double和long double。其中float一般为32位,double为64位,long double 为64位以上。
float和double的范围和精度
范围
float和double的具体区别为
float:
1bit(符号位) 8bits(指数位) 23bits(尾数位)
double:
1bit(符号位) 11bits(指数位) 52bits(尾数位)
其中指数位决定了他们的指数范围,也就是说:
float的指数是-127~128,即可以表示的数字大小范围是2-127 到2128
同理double为2-1023 到21024 。
在有符号的前提下,float可以表示-2128 到2128 的数据。
我们可以把任何二进制浮点数都化成如下标准形式:
(+/-)1.f * 2e
精度
结论:
float可以保证十进制科学计数法小数点后6位有效精度和第7位的部分精度
double可以保证十进制科学计数法小数点后15位有效精度和第16位的部分精度
浮点数的精度是由尾数来决定的。实际上一个浮点数的数值=(符号)尾数2指数 。
那么具体的精度就要看尾数能表示多少:
float的尾数为23位,也就是能表示223 =8388608。也就是最大能表示8.3886082128
并且精度最大为8位(只能保证7位最精确)。
double的尾数是52位,2^52 = 4503599627370496,一共16位,精度保证15位精确。
浮点数在计算机中的存储
以float为例:
根据二进制转为10进制: (+/-)1.f * 2e
但是此e非彼e----公式中的e要计算偏移。由于指数是从2-127~2128,所以实际上的e应该是存储的偏移量e-127。
修改后为(-1)^s *