本文由腾讯云 社区自动同步,原文地址 http://blogtest.stackoverflow.club/article/represent_float_number/
像 1011.0011 这样带小数点的表现形式,完全是纸面上的二进制数表现形式,在计算机内部是无法使用的。那么,实际上计算机是以什么样的表现形式来处理小数的呢?我们一起来看一下。
很多编程语言中都提供了两种表示小数的数据类型,分别是双精度浮点数和单精度浮点数。双精度浮点数类型用 64 位、单精度浮点数类型用 32 位来表示全体小数3。
在 C 语言中,双精度浮点数类型和单精度浮点数类型分别用 double 和 float 来表示。不过,这些数据类型都采用浮点数4来表示小数。那么,浮点数究竟采用怎样的方式来表示小数呢?接下来就让我们一起来看一下。
双精度浮点数能够表示的正数范围是 4.94065645841247×10^-324^~ 1.79769313486232×10 ^308^,负数范围是 - 1.79769313486232×10^308^~-4.94065645841247×10^-324^。单精度浮点数能够表示的正数范围是 1.401298×10^-45^ ~ 3.402823×10^38^ ,负数范围是 -3.402823×10^38^ ~ -1.401298×10^-45^ 。不过,正如正文中所介绍的那样,在这些范围中,有些数值是无法正确表示的。
像 0.12345×103 和 0.12345×10-1 这样使用与实际小数点位置不同的书写方法来表示小数的形式称为浮点数。与浮点数相对的是定点数,使用定点数表示小数时,小数点的实际位置固定不变。例如,0.12345×10^3^ 和 0.12345 ×10^-1^ 用定点数来表示的话即为 123.45 和 0.012345。
浮点数是指用符号、尾数、基数和指数这四部分来表示的小数。因为计算机内部使用的是二进制数,所以基数自然就是 2。因此,实际的数据中往往不考虑基数,只用符号、尾数、指数这三部分即可表示浮点数。也就是说,64 位(双精度浮点数)和 32 位(单精度浮点数)的数据,会被分为三部分来使用
浮点数的表现形式。由符号、尾数、基数、指数四部分构成
浮点数的内部构造(IEEE 的规定)
浮点数的表现方式有很多种,这里我们使用最为普遍的 IEEE 5标准。双精度浮点数和单精度浮点数在表示同一个数值时使用的位数不同。此外,双精度浮点数能够表示的数值范围要大于单精度浮点数。
5IEEE(Institute of Electrical and Electronics Engineers)是指美国电气和电子工程师协会。该协会制定了计算机领域的各种规定。读作“eye-triple-e,I-3E”。
符号部分是指使用一个数据位来表示数值的符号。该数据位是 1 时表示负,为 0 时则表示“正或者 0”。这和用二进制数来表示整数时的符号位是同样的。数值的大小用尾数部分和指数部分来表示。例如,小数就是用“尾数部分 × 2 的指数部分次幂”这样的形式来表示的。