小数化分数
只考虑纯循环小数. 以循环节中的数字为分子, 相同位数的数字 9 为分母,
再约分就得到结果. 例如
`0. dot 3 = 3/9 = 1/3`,
`quad 0. dot 0 dot 9 = 09/99 = 1/11`,
`0. dot 1 4285 dot 7 = 142857/999999 = 1/7`,
`quad 0. dot 0 7692 dot 3 = 076923/999999 = 1/13`.
分数化小数 当然可以直接作除法. 也可以利用熟记的简单分数的值 (见下表) 做快速计算: `1/12 = 5/60 = 0.08 dot 3`, `quad 1/15 = 6/90 = 0.0 dot 6`, `quad 1/18 = 5/90 = 0.0 dot 5`. 此外, 由原根的知识知道, 1/17 的循环节有 16 位, 1/19 的循环节有 18 位, 等等. 100 以内满足 1/n 的循环节恰有 n-1 位的数字 n 有 7, 17, 19, 23, 29, 47, 59, 61, 97.
1/2 | 0.5 | 3/8 | 0.375 | 1/7 | `0.dot 1 4285 dot 7` | 5/7 | `0.dot 7 1428 dot 5` |
1/4 | 0.25 | 5/8 | 0.625 | 2/7 | `0.dot 2 8571 dot 4` | 6/7 | `0.dot 8 5714 dot 2` |
3/4 | 0.75 | 7/8 | 0.875 | 3/7 | `0.dot 4 2857 dot 1` | 1/9 | `0. dot 1` |
1/8 | 0.125 | 1/16 | 0.0625 | 4/7 | `0.dot 5 7142 dot 8` | 1/11 | `0. dot 0 dot 9` |
令 `f(x) = sum_(n ge 0) n * x^n` `= x "d"/dx sum_(n ge 0) x^n` `= x "d"/dx 1/(1-x)` `= x/(1-x)^2`, 则 `f(10^-2) =10^-2/(1-10^-2)^2 = 100/99^2`. 于是 `100//99^2 = 0.010203040506070809...`
口算开平方
利用微分近似 `sqrt(1+x) ~ 1 + x/2` (`x to 0`) 来计算平方根.
如计算 `sqrt n`, 可先取一个接近 `n` 的完全平方数 `m^2`,
记 `x = n // m^2 - 1`, 则
`sqrt n = m sqrt (n / m^2)`
`= m sqrt(1+x)`
`~~ m (1 + x/2)`
`= m + (n - m^2) / (2 m)`.
如,
`sqrt(97) ~~ 10 - 3/(2 xx 10) = 9.85`,
`sqrt "e" ~~ sqrt(2.72) ~~ 1.6 + (0.16)/(2 xx 1.6) = 1.65`,
`sqrt pi ~~ sqrt(3.14) ~~ 1.8 - (0.1)/(2 xx 1.8) = 1.77 dot 2`.
可以用计算器验证上面各式的精度.
用 Padé 近似开方 `x` 充分小时,
`(1+x)^(1/a) ~~ (2a+(a+1)x)/(2a+(a-1)x)`,
`sqrt(1+x) ~~ (4+3x)/(4+x)`,
`root 3 (1+x) ~~ (3+2x)/(3+x)`.
如 `root 3 2 ~~ (3+2)/(3+1) = 5/4`;
进一步改进为
`root 3 2 = 5/4 root 3 (128/125)`
`~~ 5/4 (3+6/125)/(3+3/125)`
`= 5/4 * 127/126`
`~~ 1.25992`.
笔算开平方 求 `root 4 1.33`.
# 笔算开平方的竖式表示 # 同理 1 1 5 1 0 7 2 -------- ----------- 1 / 1 33 00 1 / 1 15 00 00 1 1 --- --- 21 / 33 20 / 15 21 0 ------ ------- 225 / 12 00 207 / 15 00 11 25 14 49 ------ 2142 / 51 00 42 84 # 每步把当前答案的 20 倍加上一位数字, 再与这位数字相乘, # 要求不超过当前余数, 如此做下去.
对数的估算
首先记住 `ln 2 ~~ 0.693`, `ln 3 ~~ 1.099` 等,
然后利用 Padé 近似 `ln(1+1/x) ~~ 2/(2x+1)` (`x` 充分大). 例如
`ln 5 = ln 4 + ln(1+1/4)`
`~~ 2 ln 2 + 2/(2*4+1)`
`~~ 1.608`,
`ln 103 = ln 128 - ln(1+25/103)`
`~~ 7 ln 2 - 2/(2*103//25 + 1)`
`~~ 4.635`.
计算器: log(5) = 1.609438, log(103) = 4.634729.
2500 0 1250 0 625 1 312 0 156 0 78 0 39 1 19 1 9 1 4 0 2 0 1 1从下到上读出各个余数, 即为二进制数: 1001 1100 0100
0000 | 0x0 | 0100 | 0x4 | 1000 | 0x8 | 1100 | 0xc |
0001 | 0x1 | 0101 | 0x5 | 1001 | 0x9 | 1101 | 0xd |
0010 | 0x2 | 0110 | 0x6 | 1010 | 0xa | 1110 | 0xe |
0011 | 0x3 | 0111 | 0x7 | 1011 | 0xb | 1111 | 0xf |
`2^1` | 2 | `2^6` | 64 | `2^16` | 65536 |
`2^2` | 4 | `2^7` | 128 | `2^20` | 1048576 |
`2^3` | 8 | `2^8` | 256 | `2^24` | 16777216 |
`2^4` | 16 | `2^9` | 512 | `2^30` | 1073741824 |
`2^5` | 32 | `2^10` | 1024 | `2^32` | 4294967296 |