从我之前的问题“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 {{}}}列出了float
,double
和long double
的宏。
以下是最小精度值的宏。
FLT_DIG 6 or greater
DBL_DIG 10 or greater
LDBL_DIG 10 or greater
如果我以面值取这些宏,我会假设float
的最小小数精度为6,而double
和long double
的最小小数精度为10然而,作为一个大男孩,我知道有些事情可能太好了,不可能成真。
因此,我想知道。浮点数,双精度数和长双精度数是否保证最小小数精度,这个最小小数精度是上面给出的宏的值吗?
如果没有,为什么?
注意: 假设我们使用的是编程语言C ++。
答案 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个有效十进制数字}}。此外,由于我的编译器上的double
与long double
的大小相同,因此它也有15到17个有效十进制数字。
可以分别从IEEE 754 single-precision binary floating-point format: binary32和IEEE 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
在此部分中,float
,double
和long double
至少具有这些属性*。