C++ 浮动、双精度和长双精度是否有保证的最小精度?

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

从我之前的问题“”中,我收到了一份

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 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秒