无穷 符号 11、定点数和浮点数(2)
目前我们需要表达“0”。这是一种特殊情况,下面对其进行说明:
·如果e=0且f=0,则该数为0.在这种情况下,通常把32位都设置为0以表示该数为0.但是符号位可以设置为1,这种数可以解释为负0.负0可以用来表示非常小的数,这些数极小以至于不能再单精度格式下用数字和指数来表示。但它仍然小于0.
·如果e=0,且f不等于0,则该数是合法的,但不是规范化的。可以表示为(-1)sx0.fx2-127。注意,在有效数中,小数点左边是0.
·如果e=255且f=0,则该数被解释为无穷大或无穷小。取决于符号位s的值。
·如果e=255且f不等于0,则该值被解释为“不是一个数”,通常被缩写为NaN。NaN用来表示位置的数或非法操作的结果。
单精度浮点格式下,可以表示的规格化的最小正、负二进制数是:
1.00000000000000000000000x2-126,小数点后面跟着23个二进制0.单精度浮点格式下,可以表示规格化的最大正、负二进制数是:
1.11111111111111111111111x2127,在十进制下,这两个数近似地等于1.175494352x10-38和3.402823466x1038,也就是单精度浮点数的有效表示范围。
如前所述,10位二进制数可以近似的用3位十进制数来表示。其含义是,如果把10位都置1,即十六进制的3FFh或十进制的1023,它近似等于把十进制的3位都置为9,即999,可以表示为下面的约等式:210=103
两者关系以为这,单精度浮点数格式存放的24位二进制数大体上与7位十进制数相等,因此,可以说单精度浮点格式提供24位的二进制精度或7位十进制精度。精度大概是1/224,或者百万分之六
如果用单精度浮点数来存放262144.00元和262144.01元,可以发现在计算机存储为同一个数:
1.00000000000000000000000x218,这就是人们在处理钱的时候更愿意用定点数的一个原因。
也会有一些崩溃的问题,如果你程序进行了一系列计算,应该得到的结果为3.5,由于使用浮点数,你得到的可能是3.499999999999。这种问题在浮点数运算中经常发生,而且没有一套完整的解决方案。
要解决上面问题,你可以考虑使用双精度浮点数,这种类型需要8个字节来表示,结构如下:
双精度浮点数的指数偏移量是1023或十六进制的3FFh,因此该格式存储的数可以表示为:
(-1)sx1.fx2e-1032.
上面提到的关于单精度浮点格式下的0,无穷大(小)和NaN的判断规则同样适用于双精度浮点格式。无穷 符号
双精度浮点格式下可以表示的最小正数或负数位:
1.0000000000000000000000000000000000000000000000000000x2-1022
后面有52个0,同样,可以表示最大为
1.1111111111111111111111111111111111111111111111111111x21023
十进制表示的范围是2.2250738585072014x10-308~1.17976931348623158x10308
双精度浮点格式的有效数有53位(包括前面没有列出的一位),大致相当于十进制的16位。与单精度浮点格式相比,这已经有了很大的改进,但仍然不能避免两个不同的数存储为同一个数的情况。例如:140737488355328.00和140737488355328.01。在内存中,两书会被当做同一个数来处理,他们的双精度浮点格式表示为:42E0000000000000h即1.0000000000000000000000000000000000000000000000000000x247
文笔悟性临摹性值得称道