-3

私の例では、X はすでに長く、Y も長いです。私はその時キャストしていません。

私は本当に3乗された数で割りたいだけです。(ネイティブ ライブラリを使用)

これらの数字は非常に大きいです。それらをフロートに変換して実行すると、その値は無限大です...

System.out.println(formatter.format("%20d", (X/(Y*Y*Y))));

Y は非常に大きな数値であり、0 ではありません。X はミリ秒単位の時間の測定値です。

この質問が閉じられない場合は、しばらくして正確なコードを投稿します...今すぐアクセスできません。

コンテキスト: O(n ^ 3)の大きな表記計算を扱っています。

エラー:「スレッド「メイン」での例外 java.lang.ArithmeticException: / by zero」

答え:

あなたが本当に引用符を意味していないと仮定すると、考えられる理由は、Y * Y * Y が 2 ^ 31 より大きいためです。オーバーフローしており、下の部分が 0 です。これは、Y が 2 の倍数である場合にのみ発生すると思います^11 (2048) - しかし確かではありません*

-これは私の場合です。Y は 2048 の倍数です。これが解決策を見つけるのに役立つことを願っています。

    // Algorithm 3
    for( int n = 524288; n <= 5000000; n *= 2 ){
        int alg = 3;
        long timing;
        maxSum = maxSubSum3( a );
        timing = getTimingInfo( n, alg );
        System.out.println(fmt.format("%20s %20d %20d %20d %20d %20s%n", "Alg. 3", n, timing, timing, timing/(n*n), "time/(n*log(n))"));
    }
4

3 に答える 3

1

引用符を意味するものではないと仮定すると、考えられる理由は、Y * Y * Y が 2 ^ 31 より大きいためです。それはオーバーフローしており、下の部分は 0 です。

これは、Y が 2^11 (2048) の倍数の場合にのみ発生すると思いますが、確かではありません。

Y^3 の計算が、それを保持できるデータ型を使用して行われるようにすることで、これを回避できます。200 万未満の場合は、代わりに long を使用できます。そうでない場合は、double または BigInteger を使用する必要があります。他の値がミリ秒単位であることを考えると、浮動小数点で問題ないと思います。したがって、次のようになります。

System.out.println(formatter.format("%20d", (int)(X/((double)Y*Y*Y))));

出力にも浮動小数点を使用したい場合があります-私はそうではないと思いました。

于 2011-09-23T20:05:35.120 に答える
1

「(X/(Y*Y*Y))」を文字列リテラルとして渡すつもりはありませんか? これは、Java が実行する計算を表現するコンパイル可能な Java コードではなく、エクスプレスを含む文字列です。それが問題#1です:それらの引用符を削除してください。

第二に、フォーマッタは数値の分割とは何の関係もないので、それは関係がなく、あなたの問題でもありません。

第三に、キャスティングはこれとは何の関係もありません。あなたの問題はまさにそれが言っていることです:あなたはゼロで割っています。あなたはそれをしたくないと思います。したがって、Y は 0 でなければなりません。

第 4 に、ネイティブ ライブラリを使用するものは何もありません。それはすべてJavaです。そうですか、そうですか。

BigInteger を使用して、long をオーバーフローする非常に大きな値の計算を実行することができます。しかし、それはどういうわけかゼロによる除算ではなく、ゼロによる除算ではありません。

于 2011-09-23T19:47:57.187 に答える
0

longまたはfloat変換のいずれかを試してみてください。

( ( X / Y ) / Y ) / Y

Y2 のべき乗 (2^22またはそれ以上)が十分に高い場合、2 のべき乗Y^3より大きくなります。Java では 64 ビットを使用しますが、それは正しくありませんか? 2^64long

于 2011-09-23T19:41:07.053 に答える