浮点数
浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意
某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机
中通常是 2)的整数次幂得到,这种表示方法类似于基数为 10 的科学记数法。
浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的
近似或舍入。
一个浮点数 a 由两个数 m 和 e 来表示:a = m × b^e。在任意一个这样的系统中,
我们选择一个基数 b(记数系统的基)和精度 p(即使用多少位来存储)。m(即尾
数)是形如±d.ddd...ddd 的 p 位数(每一位是一个介于 0 到 b-1 之间的整数,包括 0 和
b-1)。如果 m 的第一位是非 0 整数,m 称作规格化的。有一些描述使用一个单独的符
号位(s 代表+或者-)来表示正负,这样 m 必须是正的。e 是指数。
由此可以看出,在计算机中表示一个浮点数,其结构如下:
尾数部分(定点小数) 阶码部分(定点整数)
数符± 尾数 m 阶符± 阶码 e
这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。
例如,一个指数范围为±4 的 4 位十进制浮点数可以用来表示 43210,4.321 或
0.0004321,但是没有足够的精度来表示 432.123 和 43212.3(必须近似为 432.1 和
43210)。当然,实际使用的位数通常远大于 4。
此外,浮点数表示法通常还包括一些特别的数值:+∞和 ∞(正负无穷大)以及−
NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN 则指示非法操
作或者无法定义的结果。
众所周知,计算机中的所有数据都是以二进制表示的,浮点数也不例外。然而浮点
数的二进制表示法却不像定点数那么简单了。
先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮
点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点
数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么。
C++中的浮点数有 6 种,分别是:
float:单精度,32 位
unsigned float:单精度无符号,32 位
double:双精度,64 位
unsigned double:双精度无符号,64 位
long double:高双精度,80 位
unsigned long double:高双精度无符号,80 位(嚯,应该是 C++中最长的内置
类型了吧!)
然而不同的编译器对它们的支持也略有不同,据我所知,很多编译器都没有按照
IEEE 规定的标准 80 位支持后两种浮点数的,大多数编译器将它们视为 double,或许
还有极个别的编译器将它们视为 128 位?!对于 128 位的 long double 我也仅是听说过,
没有求证,哪位高人知道这一细节烦劳告知。
下面我仅以 float(带符号,单精度,32 位)类型的浮点数说明 C++中的浮点数是
如何在内存中表示的。先讲一下基础知识,纯小数的二进制表示。(纯小数就是没有整
数部分的小数,讲给小学没好好学的人)
评论0