C++ 由C+担保的“双重”+;03来精确表示小整数?

C++ 由C+担保的“双重”+;03来精确表示小整数?,c++,floating-point,integer,c++03,C++,Floating Point,Integer,C++03,C++03标准是否保证足够小的非零整数在double中精确表示?如果不是,那么C++11呢?注意,我在这里没有假设IEEE符合性 我怀疑答案是否定的,但我希望被证明是错的 当我说足够小的时候,我的意思是,由一些可以从C++03的保证中得到的值所限定,甚至可以通过std::numeric_limits提供的值来计算 编辑: 很明显(现在我已经检查过了),std::numeric\u limits::digits与DBL\u MANT\u DIG是一样的,而std::numeric\u limit

C++03标准是否保证足够小的非零整数在
double
中精确表示?如果不是,那么C++11呢?注意,我在这里没有假设IEEE符合性

我怀疑答案是否定的,但我希望被证明是错的

当我说足够小的时候,我的意思是,由一些可以从C++03的保证中得到的值所限定,甚至可以通过
std::numeric_limits
提供的值来计算


编辑:

很明显(现在我已经检查过了),
std::numeric\u limits::digits
DBL\u MANT\u DIG
是一样的,而
std::numeric\u limits::digits10
DBL\u DIG
是一样的,对于C++03和C++11都是这样

此外,就
DBL\u MANT\u DIG
DBL\u DIG
的含义而言,C++03遵从C90,C++11遵从C99

C90和C99均规定
DBL_DIG
的最小允许值为10,即10位十进制数字

那么问题是,这意味着什么?这是否意味着最多10位十进制数字的整数可以保证在
double
中精确表示

在这种情况下,C99中的
DECIMAL\u DIG
和C99§5.2.4.2.2/12中的以下注释的目的是什么

从(至少)双精度到十进制的转换,带十进制数字和返回 应该是身份功能


以下是C99§5.2.4.2.2/9关于DBL_DIG的内容:

Number of decimal digits, 'q', such that any floating-point
number with 'q' decimal digits can be rounded into a
floating-point number with 'p' radix 'b' digits and back again
without change to the q decimal digits,

    { p * log10(b)              if 'b' is a power of 10
    {
    { floor((p-1) * log10(b))   otherwise

FLT_DIG   6
DBL_DIG   10
LDBL_DIG  10

如果有人能帮我打开这个包,我会很高兴的。

好吧,3.9.1[基本.基本]第8段说

。。。浮点类型的值表示由实现定义

至少,实现必须定义它使用的表示形式

另一方面,
std::numeric_limits
定义了两个成员,这似乎意味着表示形式为有效位基数指数:

  • std::numeric\u limits::radix
    :指数的基数
  • std::numeric\u limits::digits
    :基数的数字
我认为这些语句意味着可以表示
0
范围内的整数。。。基数:1。精确地表示。< / P > < P>从C标准,“浮点类型<代码> <代码> >,这是C++的标准,我假设你可以将<代码> FLTYRX 和 FLTM.MtTyDigi/<代码>成有用的信息:尾数中的位数和它们表达的基数。
例如,对于单精度IEEE754浮点,这将分别是2和24,因此您应该能够存储绝对值高达224的整数。

如果有人愿意破译,C99标准的§5.2.4.2.2中给出了许多浮点类型的要求(在C++03中是规范性的)。它可能对某些整数有某种保证。C99在C++03中规范化到底意味着什么?这意味着无论何时引用它都应该被视为万能真理!在这种情况下,它作为
标题定义的一部分被引用。它基本上借鉴了其他标准,我可以看到C99在C++03[intro.refs]中被提到为一个规范性引用。然而,C99并不像C++03[intro.scope]中所说的那样(至少在大多数情况下)被认为是C++03的一部分。特别是,
DECIMAL\u DIG
宏不是C++03的一部分。我认为这些宏的模型是在C99 5.2.4.2.2/2中定义的,“浮点数(x)是由以下模型定义的:
x=sb^e\sum{k=1}{p}f{k}{-k},
e{min}\leq e\leq e{max}”它还取决于0是否包含在范围最小指数中。。max_指数(或者更精确地说,是否包括0到-位之间的数字,以表示此范围内的一些小整数)。标准规定了吗?为了举例说明,一方面取最小指数=100,最大指数=353,另一方面取最小指数=-353,最大指数=-100,以及IEEE 754 binary32中的其他参数。对于这两个假设的二进制浮点系统中的每一个,都不可能表示数字3。@PascalCuoq:噢,对不起。是的,0当然在浮点类型的覆盖范围内:
min\u指数
必须是负数,
max\u指数
必须是正数。@Guillaume07:您只能安全地使用最多
..:digits10位的十进制值进行往返(即,原始十进制->
double
->还原的十进制数为原始十进制数和还原的十进制数生成相同的值)。当使用更多的数字时,往返不能保证有效,尽管对于某些值仍然有效。