C++03 标准是否保证足够小的非零整数在 double
中准确表示? ?如果不是,那么 C++11 呢?请注意,我不假设此处符合 IEEE。
我怀疑答案是否定的,但我希望被证明是错误的。
当我说足够小时,我的意思是,受一些值的限制,这些值可以从 C++03 的保证中导出,甚至可以根据通过 std::numeric_limits<double>
提供的值计算得出。 .
编辑:
很明显(现在我已经检查过了)std::numeric_limits<double>::digits
与 DBL_MANT_DIG
相同, 和 std::numeric_limits<double>::digits10
与 DBL_DIG
相同,对于 C++03 和 C++11 都是如此。
此外,关于DBL_MANT_DIG
的含义,C++03遵从C90,C++11遵从C99。和 DBL_DIG
.
C90 和 C99 都规定 DBL_DIG
的最小允许值是10,即10位十进制数。
那么问题来了,这是什么意思?这是否意味着保证在 double
中精确表示最多 10 位十进制数字的整数? ?
在那种情况下,DECIMAL_DIG
的目的是什么?在 C99 中,以及 C99 §5.2.4.2.2/12 中的以下评论?
Conversion from (at least) double to decimal with DECIMAL_DIG digits and back should be the identity function.
这是 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 [basic.fundamental] 第 8 段指出
... The value representation of floating-point types is implementation-defined. ...
至少,实现必须定义它使用的表示。
另一方面,std::numeric_limits<F>
定义了几个成员,这似乎暗示表示形式是 significand radix exponent 的形式:
-
std::numeric_limits<F>::radix
: 指数的基数 -
std::numeric_limtis<F>::digits
:radix
的数量位数
我认为这些陈述意味着您可以表示 0
范围内的整数... radix digits - 1 正好。
关于c++ - C++03 保证 `double` 准确表示小整数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20849674/