在大多数计算机上,运行下面的程序会收到意想不到的结果:
#include <stdio.h>
main ()
{
int a = 300;
int b = 400;
int c = 500;
int d = 200;
float jieguo = a*b*c*d;
printf("%f",jieguo);
}
得到的结果是 -884 901 888 ,这显然违背了整数计算的规则,一系列正整数的乘积是一个负数。另一方面,整数的计算机运算却满足了真正整数运算的许多属性。例如:整数运算是可结合可交换的,这样一来,计算下面任何一个表达式的结果都是 -884 901 888
(500×400)×300×200
((500×300)×400)×200
(500×300)×(400×200)
400×(200×(500×300))
计算机没有产生我们期待的结果,但是结果确实惊人一致的。
浮点运算有完全不同的运算属性。虽然溢出会产生特殊的值(正无穷),但是不会产生一个负数。但是,另一方面,由于表示的精度有限,浮点运算是不可结合的。例如,在大多数机器上,C表达式(3.14 +le20)-le20得到的值是0,但是3.14+(le20 -le20)得到的却是3.14
我们需要了解可以表示的值的范围和计算属性。才能使编写的程序在全部的数值范围之内能够正确的工作,而且可以跨不同的机器,不同的平台。