通常情况下,在相同的2的幂范围内给定任何数字,浮点精度都是不变的 - 一个固定值。每个2的幂步长会改变绝对精度。在整个FP范围内,精度大致相对于大小。用十进制精度来描述这种相对二进制精度会产生一个摆动,其变化在DBL_DIG和DBL_DECIMAL_DIG之间,通常为15到17个十进制数字。
什么是精度?在FP中,讨论相对精度最有意义。
浮点数的形式为:
符号*尾数*pow(基数,指数)
它们具有对数分布。在100.0到3000.0之间(30倍范围)和2.0到60.0之间,不同的浮点数大约有相同数量。无论底层存储表示如何,这都是真实的。
1.23456789e100与1.23456789e-100具有大致相同的相对精度。
大多数计算机将
double
实现为
binary64。该格式具有53位
二进制精度。
介于1.0和2.0之间的
n
个数字具有相同的绝对精度,即每(2.0-1.0)/ pow(2,52)的1部分。
介于64.0和128.0之间的数字,也是
n
,具有相同的绝对精度,即每(128.0-64.0)/ pow(2,52)的1部分。
甚至在2的幂之间的数字组也具有相同的绝对精度。
在FP数字的整个正常范围内,这近似于均匀相对精度。
当这些数字表示为十进制数时,精度会
摆动:1.0到2.0的数字比2.0到4.0的数字多一个绝对精度位。比4.0到8.0的数字多2位,依此类推。
C提供DBL_DIG
,DBL_DECIMAL_DIG
以及它们的float
和long double
对应项。 DBL_DIG
表示最小的相对十进制精度。 DBL_DECIMAL_DIG
可以被认为是最大的相对十进制精度。
通常这意味着给定的double
将具有15到17位小数的精度。
考虑1.0
及其下一个可表示的double
,数字直到第17个有效小数位才会发生变化。 每个下一个double
之间相隔pow(2,-52)
或约2.2204e-16
。
/*
1 234567890123456789 */
1.000000000000000000...
1.000000000000000222...
现在考虑将
"8.521812787393891"
及其下一个可表示的数字作为十进制字符串,并使用16个有效十进制位。这两个字符串转换成
double
后都是相同的
8.521812787393891142073699...
,即使它们在第16位上有所不同。说这个
double
具有16位精度是夸大其词的。
8.521812787393891
8.521812787393891142073699...
8.521812787393892