5

n を取り、n 番目のフィボナッチ数を返すメソッドがあります。メソッドの実装内ではBigDecimal、n 番目のフィボナッチ数を取得するために使用し、メソッドを使用しtoBigInteger()てその数をBigIntegerオブジェクトとして取得します。これは、アプリケーションで巨大な数を扱っているためです。

メソッドの引数として1475を渡すまで、正しい結果が得られ続けます。私はNumberFormatException: Infinite or NaN明確な理由なしにこのケースに入ります。

この例外が発生する理由を教えてください。

これが私の方法です:

BigInteger getFib(int n){
     double phi = (1 + Math.sqrt(5))/2;
     double squareRoot = (Math.sqrt(5)) + (1/2);
     BigDecimal bd = new BigDecimal(Math.floor(Math.pow(phi, n)/(squareRoot)));
     return bd.toBigInteger();
}
4

4 に答える 4

1

あなたの問題はここにあります:

BigDecimal bd = new BigDecimal(Math.floor(Math.pow(phi, n)/(squareRoot)));

の結果はMath.floor(Math.pow(phi, n)/(squareRoot))、無限または NaN のいずれかになります。

BigDecimal javadocによると、値が無限または NaN の double を使用する場合、コンストラクター ( BigDecimal(double)) は a をスローする可能性があります。NumberFormatException

于 2013-08-03T01:51:58.367 に答える
1

これは INF や NaN の原因ではありませんが、明らかに間違っています。これ ...

double squareRoot = (Math.sqrt(5)) + (1/2);

... これと同等 ...

double squareRoot = Math.sqrt(5));

...(1/2)は整数除算であるため、整数値を返します。つまり、ゼロです。


実際、INF / NaN の最も可能性の高い説明は、「phi 1475」が大きすぎてdouble. したがって、powメソッドは返さINFれます...これは、「大きすぎる」がJavaで浮動小数点数として表される方法です。


この方法でフィボナッチ数を計算したい場合は、関連する非常に大きな数を表現できる表現を使用する必要があります...そしてそれらを十分な精度で表現します。Javadouble型はこれを行うことができません。BigDecimal実際、受け入れられた回答のコメントが示すように、... を使用して計算を行うのは困難です!

再帰関係を使用することをお勧めします。それははるかに単純になり、おそらくより効率的になります。

于 2013-08-03T01:52:28.053 に答える