base10和浮点表示

时间:2014-01-15 12:39:05

标签: c++ floating-point

base10中的

0.1在双重表示中没有对应关系。

在C ++中是否有任何保证,没有小数部分且数字减去或等于std :: numeric_limits :: digit10的base10数字必须具有正确/准确的双重表示?

2 个答案:

答案 0 :(得分:3)

Per Dietmar Kühl’s answer,C ++标准中的语句意味着[0, r d )中的整数可以准确表示,其中 r std::numeric_limits<type>::radix d std::numeric_limits<type>::digits

这反过来似乎意味着可以准确表示一个不超过std::numeric_limits<type>::digits10个基数为10位的整数。


除此之外:C ++标准对std::numeric_limits<type>::digits10的定义存在一些问题。

标准说这是“可以无变化地表示的基数10位数。”这应该只是简单的基数10位数,即整数,还是整个范围内的精确度的陈述?格式?脚注不是规范性的,它表示这相当于FLT_DIG,DBL_DIG和LDBL_DIG,它们是通过C标准定义的。 C标准在一个陈述中给出了两个定义:

  

小数位数, q ,这样任何带有 q 十进制数字的浮点数都可以用 p <舍入为浮点数/ em> radix b 数字并再次返回而不更改 q 十进制数字,

  

p log 10 b 如果 b 是10的幂   floor(( p -1)log 10 b )否则

我不相信前者是一个很好的定义。后者为IEEE-754 32位二进制浮点提供了7,但1.5e-45是一个带有2位十进制数的浮点数,并将其四舍五入为IEEE-754 32位二进制浮点数并返回给出1.401 ... e-45(因为它处于低于正常的间隔)。因此,任何带有7位十进制数字的浮点数都可以舍入为浮点数而不是更改为7位十进制数字。

答案 1 :(得分:0)

我认为根据std::numeric_limits::digit10的定义有这样的保证(当然,只要它正确实施)。相关讨论(参见最佳答案):What is the meaning of numeric_limits<double>::digits10