• ベストアンサー

rubyエラー begum out of float range

メソッド定義 a(b,d) bの中からdつを選ぶ組み合わせの個数 a(7000,3500)*((1.0/ 300)**3500)*((299.0/ 300)**3500) これを計算させるにはどうしたらいいのでしょうか? begum out of float range のエラーがでます。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

おそらく関数aはRationalで計算しているのだと思いますが、 「1.0」と記述すると、その数値は「Float」(浮動小数点型)で表現されます。 また、「RationalとFloatとの計算結果」はFloatになります。 以前の質問で別の方が答えられていた通り、Float 型は、精度に限度があり、その結果として「out of Float range」エラーになるのです。 数式中の小数値は、浮動小数点数(1.0/300)ではなく、Rational型になるようにすれば、「out of Float range」エラーは出なくなります。 a(7000,3500)*(Rational(1,300)**3500)*(Rational(299,300)**3500) で計算してください。 あと、Rationalは分数型ですので、そのまま結果表示すると分数で表示されてしまいます。 ですが、これを単純に小数(Float)に変換しようとすると、その段階で「out of Float range」になってしまいます。 一手間かかりますが、require "bigdecimal"した上で、 result = a(7000,3500)*(Rational(1,300)**3500)*(Rational(299,300)**3500) puts BigDecimal(result.numerator.to_s,1000)/BigDecimal(result.denominator.to_s,1000) とでもすれば、小数で表示できます。 ちなみに、そうやって上記結果を表示すると、 0.15(略)E-6569 と表示されますが、これは「0.(0が6569個)15(以下略)」という意味です。

関連するQ&A

専門家に質問してみよう