基元浮点和双精度支持小数位数

  • 本文关键字:支持 小数 双精度 c++
  • 更新时间 :
  • 英文 :


我读到double存储15位数字,float存储7位数字。

我的问题是,这些数字是支持的小数位数还是一个数字中的总位数?

如果您在使用IEEE-754浮点运算的体系结构上(与大多数体系结构一样(,则类型float对应于单精度,类型double对应于双精度,如标准中所述。

让我们做一些数字:

单精度:

32位表示数字,其中24位表示尾数。这意味着最低有效位(LSB(相对于MSB具有2^(-24(的相对值;隐藏1";,并且它没有被表示。因此,对于固定指数,最小可表示值是指数的10^(-7.22(倍。这意味着对于基指数表示法(3.141592653589E25(中的表示;7.22〃;十进制数是有效的,这意味着在实践中至少有7个十进制数是正确的。

双精度:

64位表示数字,其中53位用于尾数。根据同样的推理,将2^(-53(表示为10的幂会导致10^(-15.95(

如果你愿意的话,这些是"有效数字"的总数,从左到右计数,无论小数点在哪里。超过这些数字,准确性将无法保持。

您列出的计数是针对基数为10的表示法。

每种类型支持的小数位数都有宏。gcc文档解释了它们是什么以及它们的含义:

FLT_DIG

这是浮点数据类型的精度小数位数。从技术上讲,如果p和b(分别(是表示的精度和基数,那么小数精度q是小数位数的最大值,使得任何以q为基数的10位浮点数都可以四舍五入为以p为基数的b位浮点数,然后再返回,而不改变q的小数位数。

该宏的值应至少为6,以满足ISO C.

DBL_DIG
LDBL_DIG

这些类似于FLT_DIG,但分别用于数据类型double和long double。这些宏的值应该是至少10

在gcc 4.9.2和clang 3.5.0上,这些宏分别产生6和15。

这些数字是支持的小数位数还是一个数字中的总位数?

它们是每个数字中包含的有效数字(尽管您可能不需要所有这些数字,但它们仍然存在(。相同类型的尾数总是包含相同数量的位,因此如果你从十进制数字的角度来看,每个数字必然包含相同数量有效的"数字"。存储的位数不能超过尾数所能容纳的位数。

然而,"支持"的位数要大得多,例如float通常最多支持38位小数,double最多支持308位小数,但这些数字中的大多数都是无效(即"未知"(。

尽管从技术上讲,这是错误的,因为floatdouble不像我上面假设的那样具有普遍定义的大小(它们是实现定义的(。此外,存储大小不一定与中间结果的大小相同。

C++标准非常不愿意精确定义任何基本类型,几乎所有内容都留给实现。浮点类型也不例外:

3.9.1/8
有三种浮点类型:浮点、双精度和长双精度。类型double提供的精度至少与float相同,而类型long double至少提供的精度与double相同。float类型的值的集合是double类型的值集合的子集;双精度类型的值集合是长双精度类型值集合的子集。浮点类型的值表示是由实现定义的。

当然,所有这些在实践中并没有特别的帮助。

在实践中,浮点(通常(符合IEEE 754,float具有32位的宽度,double具有64位的宽度(存储在存储器中,寄存器在一些著名的主流架构上具有更高的精度(。

这分别相当于24位和53位的matissa,或7和15位全小数

最新更新