次のコードがあります。
def pi
pivalue = 4 * (4 * Math.atan(1.0/5.0) - Math.atan(1.0/239.0))
pivaluestring = pi.to_s
puts pivaluestring[0,20]
end
pivalue が小数点以下 16 桁に制限されているのはなぜですか? はるかに大きな制限(最大)が必要です。
BigMathとBigDecimalを使用します(標準ライブラリ内):
require "bigdecimal/math"
p BigMath::PI(50).to_s
#=>"0.3141592653589793238462643383279502884197169399375105820974944592309049629352442819E1"
# Or
include BigMath
p PI(100).to_s
BigDecimal は、任意精度の浮動小数点 10 進数演算を提供します。
であるからMath.atan
ですFloat
。計算の途中でそれだけの精度しか得られないため、それ以上の精度を得ることはできません。
ちなみに、浮動小数点精度の場合、次のようにするだけで pi を取得できます。
Math::PI # => 3.141592653589793
浮動小数点値は、値を格納するために使用されるビット数に基づいて精度が制限されます。浮動小数点演算と制限に関する次の記事をお読みください。