重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

メソッド定義 a(b,d) bの中からdつを選ぶ組み合わせの個数

a(7000,3500)*((1.0/ 300)**3500)*((299.0/ 300)**3500)
これを計算させるにはどうしたらいいのでしょうか?
begum out of float range のエラーがでます。

A 回答 (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(以下略)」という意味です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!