円周率問題
> 円周率を 3 で計算すると,円じゃなくて六角形と考えることになる,という話がありますが,では 3.14 とすると何角形と考えることになるのでしょうか。C言語を使って計算してください。
力技だとこんな感じ?
pi.rbpi = Math.atan(1) * 4
(4..10000).each { |n|
theta = 2.0 * pi / n
l = Math.sqrt(1 + 1 - 2 * Math.cos(theta))
puts "#{n} #{l * n / 2.0}"
}
% curl -s https://scrapbox.io/api/code/prog-exercises/%E5%86%86%E5%91%A8%E7%8E%87%E5%95%8F%E9%A1%8C/pi.rb | ruby
余弦定理ナシではできないか?
ABがわかればOBもBCもわかるからACもわかる
∠AOC = 30゜のとき
AC = 1.0
12角形を考える
AB = AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 12 / 2.0
24角形
AB = AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 24 / 2.0
48角形
AB = AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 48 / 2.0 まだだめか
96角形
AB = AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 96 / 2.0 3.14になった!
192角形
AB = AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 192 / 2.0 3.14145
4角形からはじめたら64角形ぐらいで3.14になりそう
AC = Math.sqrt(2.0)
8角形
AB=AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 8 / 2.0
16角形
AB=AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 16 / 2.0
32角形
AB=AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 32 / 2.0 3.1365
64角形
AB=AC / 2.0 OB = Math.sqrt(1.0**2-AB**2) BC = 1-OB AC = Math.sqrt(AB**2+BC**2)
AC * 64 / 2.0 3.14033
ということで、48以上64以下ということはわかる