原始浮点数和双重支持多少个小数位?

时间:2015-01-20 12:48:40

标签: c++

我读过双倍存储15位数字,浮动存储7位数。

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

4 个答案:

答案 0 :(得分:4)

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

  

FLT_DIG

     

这是float数据类型的精度的小数位数。从技术上讲,如果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。

答案 1 :(得分:2)

这些是"重要数字的总数"如果你愿意,从左到右计数,不管小数点在哪里。超过这些数字,不保留准确性。

您列出的计数用于基数10表示。

答案 2 :(得分:2)

  

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

它们是每个数字中包含的重要数字(尽管您可能不需要所有数字,但它们仍然存在)。相同类型的尾数始终包含相同的位数,因此每个数字都包含相同数量的有效"数字"如果你用十进制数字来思考。您不能存储多于尾数的数字。

"支持"但是,数字要大得多,例如float通常最多支持38个十进制数字,double最多可支持308个十进制数字,但这些数字中的大多数不重要(即"未知")。

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

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

  

3.9.1 / 8
  有三种浮点类型:float,double和long double。 double类型提供至少与float一样多的精度,long double类型提供至少与double一样多的精度。 float类型的值集是double类型的值集的子集; double类型的值集是long double类型的值集的子集。浮点类型的值表示是实现定义的。

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

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

这相当于24位和53位matissa,或 7和15全十进制

答案 3 :(得分:2)

如果您使用的是使用IEEE-754浮点运算的架构(如在大多数架构中),那么类型float对应于单精度,类型double对应于双精度,如在标准中描述。

让我们做一些数字:

单精度:

32位代表数字,其中 24位用于尾数。这意味着最低有效位(LSB)相对于MSB具有 2 ^( - 24)的相对值,其是“隐藏1”,并且未表示。因此,对于固定指数,最小可表示值是指数的 10 ^( - 7.22)倍。这意味着对于基本指数表示法(3.141592653589 E 25)的表示,只有“7.22”十进制数是重要的,这实际上意味着至少7位小数将始终是正确的。

双精度:

64位表示数字,其中 53位用于尾数。按照相同的推理,将 2 ^( - 53)表示为10的幂将导致 10 ^( - 15.95),这意味着至少15位小数将总是正确的。