0. 概要
二进制系列文章已经写到第五篇了,不出意外的话,这应该会是二进制系列的最后一篇。我们先来罗列一下前四篇:
其中,在上一篇里,我们认识了四种机器数,它们各司其职,但总的来说,有一个特点,就是在对计算机里的正负号做文章。今天介绍的定点数和浮点数,则是对小数点做文章。
上一篇文章的开头,我们说到,计算机中只能存储数字,因此需要用0和1来表示正负,同样的,计算机中的小数点,也要用特殊的形式来表示,共有两种,即本文所要讲的定点数和浮点数。
1. 定点数
所谓定点数,就是指小数点的位置是固定的,约定小数点在某一个位置上,因此,机器在处理定点数时,并不存储它的小数点。使用定点数的机器,被称为定点机。当然了,现代计算机一般只要有运算部件,都会提供对定点数运算的支持。
虽然理论上,定点数的小数点的位置可以任意规定,但通常只会用定点数表示纯小数或整数,当表示纯小数时,小数约定在上一篇文章里反复提及的符号位和数值部分之间,同理,表示整数时,则在数值部分的后面。下图展示了定点小数和定点整数的结构:
为什么通常只用定点数表示纯小数或整数呢?因为上面我们提到的,定点机在存储定点数时,并不存储小数点,因此我们的数字在定点机中是一串看上去像整数的东西,如果我们存入了非纯小数或整数,它们的计算结果就会很容易出现问题,譬如1.23和12.3,在定点机中它们没有小数点,都是123,那么它们在做加、减、除后的结果都是不对的,即便是乘法,其结果也需要我们自己再去算它的小数点位。
而纯小数或整数处理起来就方便多了,譬如整数,它的加、减、乘三种运算结果都是整数,而除法如果遇到除不尽的情况,一般也会取余处理。纯小数同理,但比整数稍微麻烦一点,主要是加法和除法,会有益处的风险,此时一些定点机可能会直接抛出异常。
定点机由于它的特性,在硬件层面设计会更简单。
2. 浮点数
浮点数是大家比较熟悉的一个词汇,也就是我们平时编程语言中的float和double。前面定点数由于本身性质的限制,难以处理复杂的非纯小数和整数,此时就需要浮点数来处理了。
所谓浮点,与定点相对,就是小数点是浮动的,不固定的,它的形式有点像我们熟悉的科学计数法,譬如12.34这个数,可以写成下面几种形式:
$$12.34 = 1.234\times10^1 = 0