base-2:为什么 DECIMAL_DIG - DIG == 2 或 3?
base-2: why DECIMAL_DIG - DIG == 2 or 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
额外:是否保证在使用 base-2 的任何给定实现中,此差异将是 2 或 3?
是的,对于 base-2 基数,xxx_DECIMAL_DIG - xxx_DIG
将是 2 或 3。
非正式证明
对于浮点类型:
- b 是基数或基数或指数表示(整数 > 1)
- p 是精度(基数-b 有效数字中的数字)(我假设这是 > 1 和有理数)
xxx_DECIMAL_DIG
值定义为:
⎰ p log10 b — 如果 b 是 10
的幂
⎱ ⌈1 + p log10 b⌉ — 否则
xxx_DIG
值定义为:
⎰ p log10 b — 如果 b 是 10
的幂
⎱ ⌊(p - 1) log10 b⌋ — 否则
对于 b = 2,log10 b ≈ 0.301 并且是无理数 (proof).
∴ p log10 2 是无理数(因为 p 是有理数并且 > 1)。
∴⌈plog102⌉-⌊plog10 2⌋ = 1.
∴ ⌈1 + p log10 2⌉ - ⌊p log10 2⌋ = 2. — ①
⌊p log10 2⌋ - ⌊(p - 1) log10 2⌋ ∈ {0, 1}。 — ②(因为 0 < log10 2 < 1)
∴ ⌈1 + p log10 2⌉ - ⌊(p - 1) log10 2⌋ ∈ {2, 3}。 —(来自①和②) ∎
给定 xxx_DECIMAL_DIG
和 xxx_DIG
的定义,我们有
简化:
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
: 楼层((p-1)*log10(2))?
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
额外:是否保证在使用 base-2 的任何给定实现中,此差异将是 2 或 3?
是的,对于 base-2 基数,xxx_DECIMAL_DIG - xxx_DIG
将是 2 或 3。
非正式证明
对于浮点类型:
- b 是基数或基数或指数表示(整数 > 1)
- p 是精度(基数-b 有效数字中的数字)(我假设这是 > 1 和有理数)
xxx_DECIMAL_DIG
值定义为:
⎰ p log10 b — 如果 b 是 10
的幂
⎱ ⌈1 + p log10 b⌉ — 否则
xxx_DIG
值定义为:
⎰ p log10 b — 如果 b 是 10
的幂
⎱ ⌊(p - 1) log10 b⌋ — 否则
对于 b = 2,log10 b ≈ 0.301 并且是无理数 (proof).
∴ p log10 2 是无理数(因为 p 是有理数并且 > 1)。
∴⌈plog102⌉-⌊plog10 2⌋ = 1.
∴ ⌈1 + p log10 2⌉ - ⌊p log10 2⌋ = 2. — ①
⌊p log10 2⌋ - ⌊(p - 1) log10 2⌋ ∈ {0, 1}。 — ②(因为 0 < log10 2 < 1)
∴ ⌈1 + p log10 2⌉ - ⌊(p - 1) log10 2⌋ ∈ {2, 3}。 —(来自①和②) ∎
给定 xxx_DECIMAL_DIG
和 xxx_DIG
的定义,我们有
简化:
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
: 楼层((p-1)*log10(2))?