在以前的时候,浮点计算使用的是软件方式完成的,效率比较低。现代CPU大多数都带有设计良好的浮点运算单元,这样以来浮点运算与整数运算之间的性能差异就变小了。
虽然浮点运算在有了FPU之后逐渐流行起来,但是时至今日,仍然有很多程序员不了解浮点格式所固有的缺陷。从本质上讲,浮点运算只是实数运算的一个近似。如果一个软件工程师不了解这种近似所带来的问题,那这种不精确的表示法就会给其所编写的软件带来非常严重的问题。
浮点数只能表示一个实数的近似值。原因是可能存在的实数有无穷多个,可以用数轴一一表示,但浮点表示法只有有限的位数。因此,浮点表示法仅能表示有限个不同的数。当某个浮点数格式无法精确表示某个实数时,作为替代只能选用一个最接近的,它能够精确表示的浮点数。整数是无法表示任何小数的,整数的另一个问题是它们只能表示范围在0~2^n-1或者-2^(n-1)~2^(n-1)-1的数。定点数倒是可以表示小数,但是代价是能表示的整数更少,这就是动态范围问题,不过已经被浮点格式解决了。
考虑一个16位无符号定点格式,它使用8位作为小数部分,8位作为整数部分。而整数部分可以表示的范围是0~255,而小数部分可以表示0以及2^(-8)到1之间的小数,精度大约是2^(-8)。现在假定在一次运算中只需要两位来表示小数值0.0,0.25,0.5,0.75,不幸的是小数部分的其他六位不得不被浪费了。如果能够将这些位用于整数部分,把整数的范围从0~255扩展到0~16383岂不是很好?其
虽然浮点运算在有了FPU之后逐渐流行起来,但是时至今日,仍然有很多程序员不了解浮点格式所固有的缺陷。从本质上讲,浮点运算只是实数运算的一个近似。如果一个软件工程师不了解这种近似所带来的问题,那这种不精确的表示法就会给其所编写的软件带来非常严重的问题。
浮点数只能表示一个实数的近似值。原因是可能存在的实数有无穷多个,可以用数轴一一表示,但浮点表示法只有有限的位数。因此,浮点表示法仅能表示有限个不同的数。当某个浮点数格式无法精确表示某个实数时,作为替代只能选用一个最接近的,它能够精确表示的浮点数。整数是无法表示任何小数的,整数的另一个问题是它们只能表示范围在0~2^n-1或者-2^(n-1)~2^(n-1)-1的数。定点数倒是可以表示小数,但是代价是能表示的整数更少,这就是动态范围问题,不过已经被浮点格式解决了。
考虑一个16位无符号定点格式,它使用8位作为小数部分,8位作为整数部分。而整数部分可以表示的范围是0~255,而小数部分可以表示0以及2^(-8)到1之间的小数,精度大约是2^(-8)。现在假定在一次运算中只需要两位来表示小数值0.0,0.25,0.5,0.75,不幸的是小数部分的其他六位不得不被浪费了。如果能够将这些位用于整数部分,把整数的范围从0~255扩展到0~16383岂不是很好?其