Project Euler 177

プロジェクトオイラー
http://projecteuler.net/index.php?section=problems&id=177


意外なトラップが。
角度を求めるのにasinを使ったのだが、

asin(1.0) = π / 2

となるところが、大きく値がずれて、10-9のトレランス内に入らずに整数の角度の組から落ちていた。

sin(π/2 - x) = cos(x) = 1 - x2/2 + ...

だから、逆関数は、

asin(1-x) = π/2 - √2x1/2 + ...

となる。
IEEE754の倍精度で表される1より小さい最大の数値は、

1 - 2-53

だが、

&pi / 2 - asin(1-2-53) = 1.49011611938e-08

となる。
逆に、1より大きい最小の数値は、

1 + 2-52

だが、これをasinに代入すると、

ValueError: math domain error

となる。
このように、逆三角関数の扱いはデリケートにされなければならない。