C语言 base-2:为什么DECIMAL_DIG - DIG == 2或3?



base-2:为什么DECIMAL_DIG - DIG== 2或3?

例子:

  • FLT_DECIMAL_DIG - FLT_DIG == 9 - 6 == 3
  • DBL_DECIMAL_DIG - DBL_DIG == 17 - 15 == 2
  • LDBL_DECIMAL_DIG - LDBL_DIG == 21 - 18 == 3
  • FLT16_DECIMAL_DIG - FLT16_DIG == 5 - 3 == 2

Extra:是否保证在使用base-2的任何给定实现上,这个差异将是2或3?

是的,对于以2为基数的基数,xxx_DECIMAL_DIG - xxx_DIG将是2或3。

非正式证明

对于浮点类型:

  • b是基数或指数表示(整数>1)
  • p是精度(基数-b位的有效位数)(我假设这是>1、合理)

xxx_DECIMAL_DIG值定义为:

p日志<子>10 b——如果b是10的幂
⎱⌈1 + p日志<子>10 b⌉——否则

xxx_DIG值定义为:

p日志<子>10 b——如果b是10的幂
⎱⌊(p- 1)日志<子>10 b⌋——否则

对于b= 2, log10b≈0.301,是无理数(证明)。
.plog102是非理性的(因为p是理性的,而>1)。
∴⌈p日志<子>10 2⌉-⌊p日志<子>102⌋= 1。
∴⌈1 + p日志<子>10 2⌉-⌊p日志<子>102⌋= 2。——①
p日志<子>10 2⌋-⌊(p- 1)日志<子>102⌋∈{0,1}。-②(自0102 <1)
∴⌈1 + p日志<子>10 2⌉-⌊(p- 1)日志<子>102⌋∈{2,3}。-(来自①和②)* *

xxx_DECIMAL_DIG的定义和xxx_DIG
2 & lt; =装天花板(1 + p * log10(2))——地板((p - 1) * log10 (2)) & lt;简化:= 3

2 <=     ceil(1+p*log10(2)) - floor((p-1)*log10(2)) <= 3
2 <= 1 + ceil(  p*log10(2)) - floor((p-1)*log10(2)) <= 3
let q = p – 1
2 <= 1 + ceil(  (1 + q)   *log10(2)) - floor((p-1)*log10(2)) <= 3
2 <= 1 + ceil(log10(2) + q*log10(2)) - floor(  q  *log10(2)) <= 3
let R = trunc(q*log10(2))
let r = trunc(q*log10(2)) – R, r is [0.0 …1.0)
log10(2) = 0.301…
2 <= (1 + R + ceil(0.301… + r)) – (R + floor(r)) <= 3
2 <=  1     + ceil(0.301… + r)       – floor(r)  <= 3
2 <=  1     + ceil(0.301… + r)       – 0         <= 3
When r <= 1.0 - 0.301…
2 <= 1 + 1 <= 3
Otherwise r > 1.0 - 0.301…
2 <= 1 + 2 <= 3

即使显示差异是2或3,我想接下来的问题是为什么
xxx_DECIMAL_DIG: ceil(1+p*log10(2))

xxx_DIG: floor((p-1)*log10(2))?

相关内容

  • 没有找到相关文章

最新更新