C++ 浮动、双精度和长双精度是否有保证的最小精度?
从我之前的问题“”中,我收到了一份 C提供DBL_DIG、DBL_DECIMAL_DIG及其浮点和长双精度 相对应的人。DBL_DIG表示最小相对小数 精确DBL_DECIMAL_DIG可被视为最大相对值 十进制精度 我查了这些宏。它们位于标题C++ 浮动、双精度和长双精度是否有保证的最小精度?,c++,floating-point,language-lawyer,floating-point-precision,minimum,C++,Floating Point,Language Lawyer,Floating Point Precision,Minimum,从我之前的问题“”中,我收到了一份 C提供DBL_DIG、DBL_DECIMAL_DIG及其浮点和长双精度 相对应的人。DBL_DIG表示最小相对小数 精确DBL_DECIMAL_DIG可被视为最大相对值 十进制精度 我查了这些宏。它们位于标题中。从列表中,它们列出了浮点、双精度和长双精度的宏 以下是最小精度值的宏 FLT_DIG 6或更高版本 DBL\u DIG 10或更大 LDBL\u挖掘10或更大 如果按面值计算这些宏,我会假设float的最小小数精度为6,而double和long dou
中。从列表中,它们列出了浮点
、双精度
和长双精度
的宏
以下是最小精度值的宏
FLT_DIG 6或更高版本
DBL\u DIG 10或更大
LDBL\u挖掘10或更大
如果按面值计算这些宏,我会假设float
的最小小数精度为6,而double
和long double
的最小小数精度为10。然而,作为一个大男孩,我知道有些事情可能太美好而不真实
因此,我想知道。浮点、双精度和长双精度是否保证了最小十进制精度,并且该最小十进制精度是否为上述宏的值
若否,原因为何
<强>注释:< /强>假设我们使用的是编程语言C++。 浮点、双精度和长双精度是否保证了最小十进制精度,并且该最小十进制精度是否为上述宏的值
我在标准中找不到任何地方可以保证十进制精度的最小值 以下引用可能有用: 示例 8位二进制类型可以精确表示任意两位十进制数,但不能表示3位十进制数256..999。8位类型的digit10
的值为2(8*std::log10(2)
为2.41)
标准32位IEEE 754浮点类型具有24位小数部分(23位写入,一位隐含),这可能表明它可以表示7位小数(24*std::log10(2)
is 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\u DIG 6
DBL\u DIG 10
LDBL\u DIG 10
如果为true,则的保证将应用于浮点类型F
否则(无论如何),诸如DBL_DIG
等符号的最小允许值由C标准规定,对于库而言,这是无可争议的,“通过引用并入[C++]国际标准”,引自C++11§17.5.1.5/1
编辑:
正如TC在这里的评论中所指出的
“并通过§18.3.3[c.限制]标准化合并;最低值在C标准的§5.2.4.2.2中依次规定
不幸的是,从形式上看,C++11的引用首先来自第17.5节,该节只提供了信息,而不是规范。第二,C标准中规定的值为最小值的措辞也在一节(C99标准的附录E)中,该节是信息性的,而非规范性的。因此,虽然可以将其视为实际担保,但它不是正式担保
一个强有力的迹象表明,实际上,
浮点
的最小精度为6位小数,任何实现都不会给出更少的精度:
输出操作默认为精度6,这是标准文本
免责声明:可能是有额外的措辞提供了我没有注意到的保证。不太可能,但可能。 < P> C++标准没有说明浮点类型的限制。您可以按照自己的意愿“通过引用”解释纳入C标准,但如果您采用了第5.2.4.2.2节第15子点中规定的限值(N1570): 例1 以下描述了符合本国际标准最低要求的人工浮点表示法,以及类型标题中的适当值 浮动:
FLT\u基数16
FLT\u MANT\u DIG 6
FLT_EPSILON 9.53674316E-07F
FLT\u DECIMAL\u DIG 9
FLT\u DIG 6
FLT\u MIN\u EXP-31
FLT_MIN 2.93873588E-39F
FLT\u MIN\u 10\u EXP-38
FLT\u MAX\u EXP+32
FLT_最大值3.40282347E+38F
FLT\u MAX\u 10\u EXP+38
在本节中,
float
、double
和long double
至少具有这些属性*,更具体一些。由于我的编译器使用IEEE 754标准,因此我的十进制数字精度保证为float
的6到9位有效十进制数字和15到17秒