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日志<子>10子>2⌋= 1。
∴⌈1 + p日志<子>子>10 2⌉-⌊p日志<子>10子>2⌋= 2。——①
⌊p日志<子>子>10 2⌋-⌊(p- 1)日志<子>10子>2⌋∈{0,1}。-②(自0
∴⌈1 + p日志<子>子>10 2⌉-⌊(p- 1)日志<子>10子>2⌋∈{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))?