c++ - C++03 保证 `double` 准确表示小整数吗?

标签 c++ floating-point integer c++03

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

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

当我说足够小时,我的意思是,受一些值的限制,这些值可以从 C++03 的保证中导出,甚至可以根据通过 std::numeric_limits<double> 提供的值计算得出。 .


编辑:

很明显(现在我已经检查过了)std::numeric_limits<double>::digitsDBL_MANT_DIG 相同, 和 std::numeric_limits<double>::digits10DBL_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/

相关文章:

c++ - 通过引用传递避免对象切片

c++ - 你如何正确地将 "snap"设为一个值?

c - 使用 scanf() 获取单个整数

c++ - 使用 boost.python 导出 C++ 多态函数的聪明方法

c++ - 从可变参数模板中读取参数

c++ - 静态初始化的非文字对象的销毁顺序

javascript - 为什么 5726718050568503296 在 JS 中被 chop

C:将实数转换为 64 位浮点二进制

python - Julia 中的数字分隔符

用于划分数字并显示数字模数的 c 程序不起作用