gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:37:36 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com