浮点数,双打数和长双数是否具有保证的最小精度?

时间:2015-06-02 05:10:57

标签: c++ floating-point language-lawyer floating-point-precision minimum

从我之前的问题“Is floating point precision mutable or invariant?”我收到了response,其中说

  

C提供DBL_DIG,DBL_DECIMAL_DIG及其float和long double   同行。 DBL_DIG表示最小相对小数   精确。 DBL_DECIMAL_DIG可以被认为是最大相对值   小数精度。

我看了这些宏。它们位于标题<cfloat>中。从cplusplus reference page {{}}}列出了floatdoublelong double的宏。

以下是最小精度值的宏。

  

FLT_DIG 6 or greater

     

DBL_DIG 10 or greater

     

LDBL_DIG 10 or greater

如果我以面值取这些宏,我会假设float的最小小数精度为6,而doublelong double的最小小数精度为10然而,作为一个大男孩,我知道有些事情可能太好了,不可能成真。

因此,我想知道。浮点数,双精度数和长双精度数是否保证最小小数精度,这个最小小数精度是上面给出的宏的值吗?

如果没有,为什么?

注意: 假设我们使用的是编程语言C ++。

4 个答案:

答案 0 :(得分:5)

如果std::numeric_limits<F>::is_iec559为真,那么IEEE 754 standard的保证适用于浮点类型 F

否则(并且无论如何),C标准规定了诸如DBL_DIG之类的符号的最小允许值,对于库而言,“无可争辩地”,“通过引用并入[C ++]国际标准”,如引自C ++11§17.5.1.5/ 1.

修改: 正如TC在评论中指出的那样,

  

&lt; climits&gt;和&lt; cfloat&gt;由§18.3.3[c.limits]规范地纳入;最小值依次在C标准的第5.2.4.2.2节中指定

不幸的是,对于正式视图,首先引用C ++ 11的内容来自第17.5节,它只是信息性,而不是规范性。其次,C标准中的措辞中指定的值是最小值的,也在一个(C99标准的附录E)中,它是提供信息的,而不是规范性的。因此,虽然它可以被视为实践中的保证,但它不是正式保证。

一个强有力的迹象表明float的实际最小精度是6位十进制数,没有实现会减少:

输出操作默认为精度6,这是规范性文本。

免责声明:可能有额外的措辞提供我没有注意到的保证。不太可能,但可能。

答案 1 :(得分:0)

  

浮点数,双精度数和长双精度数是否保证最小小数精度,这个最小小数精度是上面给出的宏的值?

我无法在标准中找到任何保证小数精度的最小值的地方。

http://en.cppreference.com/w/cpp/types/numeric_limits/digits10的以下引用可能有用:

  

示例

     

8位二进制类型可以精确地表示任意两位十进制数,但不能表示3位十进制数256..999。 8位类型的digits10值为2(8 * std::log10(2)为2.41)

     

标准32位IEEE 754浮点类型具有24位小数部分(写入23位,一个隐含),这可能表明它可以表示7位小数(24 * std::log10(2)是7.22),但是相对舍入误差是不均匀的,一些带有7位十进制数字的浮点值无法在转换为32位浮点数后返回:最小的正例是8.589973e9,在往返后变为8.589974e9 。这些舍入误差在表示中不能超过一位,digits10计算为(24-1)*std::log10(2),即6.92。向下舍入得到值6.

但是,C标准指定了需要支持的最小值。 从C标准:

  

5.2.4.2.2浮动类型的特征

     

...

     

9以下列表中给出的值应由具有实现定义值的常量表达式替换,这些值的大小(绝对值)大于或等于显示的值,具有相同的符号

     

...

     

- 小数位数q,这样任何带有q个十进制数字的浮点数都可以舍入为p基数为b的浮点数,然后再返回而不改变q个十进制数字,

     

...

     

FLT_DIG 6
  DBL_DIG 10
  LDBL_DIG 10

答案 2 :(得分:0)

更具体一点。由于我的编译器使用IEEE 754标准,因此我的十进制数字的精度保证float的6到9个有效十进制数字和{{1}的15到17个有效十进制数字}}。此外,由于我的编译器上的doublelong double的大小相同,因此它也有15到17个有效十进制数字。

可以分别从IEEE 754 single-precision binary floating-point format: binary32IEEE 754 double-precision binary floating-point format: binary64验证这些范围。

答案 3 :(得分:-1)

C ++标准没有具体说明浮点类型的限制。您可以根据需要“引用”解释C标准的合并,但如果您采用其中规定的限制(N1570),则第5.2.4.2.2节第15小节:

  

示例1   下面描述了满足本国际标准最低要求的人工浮点表示,以及类型标题中的适当值   浮动:
  FLT_RADIX 16
  FLT_MANT_DIG 6
  FLT_EPSILON 9.53674316E-07F
  FLT_DECIMAL_DIG 9
  FLT_DIG 6
  FLT_MIN_EXP -31
  FLT_MIN 2.93873588E-39F
  FLT_MIN_10_EXP -38
  FLT_MAX_EXP +32
  FLT_MAX 3.40282347E+38F
  FLT_MAX_10_EXP +38

在此部分中,floatdoublelong double至少具有这些属性*。