0.1在双重表示中没有对应关系。
在C ++中是否有任何保证,没有小数部分且数字减去或等于std :: numeric_limits :: digit10的base10数字必须具有正确/准确的双重表示?
答案 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