我想确认一下,C语言中双精度数据类型的有效位数表示总是0到2之间的分数,根据IEEE 754标准,精度为2^52。
这是我读到的:https://stackoverflow.com/questions/30052710/why-double-can-store-bigger-numbers-than-unsigned-long-long: ~:文本= % 20的原因% 20是% 20无符号% 20,10308)% 20但% 20不确切% 20。
我想确认C语言中双精度数据类型的有效位数表示总是0到2之间的分数,根据IEEE 754标准,精度为2^52。
不,它不是。C标准不要求符合标准的C实现对double
类型使用IEEE-754 binary64格式(也称为"双精度")。
C标准将浮点数描述为在[0,1)中有有效位数,因为它使用了一种形式,其中所有有效数字都在基数点的右侧。然而,这只是一个缩放问题,在数学上等同于更常用的形式,即第一个数字在基数点的左边。因为这种形式是由你所问的区间[0,2)所建议的,所以这个答案使用这种形式。
同样,"显著性表征"与"显著性"不同。对于有限数,IEEE-754二进制64数的数学意义在[0,2](包括0但不包括2的区间)内。(对于次正规数,它在[0,1]中,对于正规数,它在[1,2]中。)但是,有效位数表示是52位的字符串加上指数字段中的一位。(如果指数字段全为0,那么指数字段的位为0;如果指数字段既不全为0也不全为1,那么该位为1。如果全为1,则有效数不适用,因为它表示无穷大或NaN。
此外,+∞和-∞(正无穷和负无穷)在binary64格式中是可表示的数字,但在[0,2]中没有有效。并且该格式还提供了表示NaN (not a Number)的功能,它没有有效值(尽管有效字段可能提供有用的信息)。
如果C实现对double
使用IEEE-754 binary64(或任何以2为基数的格式),并且double
的"值"是一个有限数,则其有效位数在[0,2]中。
还要注意,"2^52精度"不是一个好术语,至少没有对其含义的一些定义。3精度和8精度是多少?数字本身没有什么意义。252是有效位中最高位和最低位的位置值之比,尽管次正态数无法维持该跨度。