0

式の 11 乗根を取得しようとしていますが、 が返され-infます。

std::cout << pow(j,(1.0/11.0)) << std::endl;

wherejは単なるlog表現です。その番号が有効であることを確認しましたが、有効です。力の表現が実行されている方法だと思います。これを行うより良い方法はありますか?ありがとう。

そしてはい、私はcmath自分の仕事に含めました。

4

2 に答える 2

1
  1. FPUエラーを探してみてください

    • 最も一般的なのは、一部の関数で float/double の戻り値を忘れていることです
    • これは、非常に小さい FPU スタックで問題を引き起こします。
  2. また、これを pow の前に追加してみてください

    asm { fninit; };
    
    • これによりFPUがリセットされるため、スタックに問題がある場合に役立ちます
    • もちろん、FPU の計算中にこれを実行しないでください。
    • それはその結果を破壊するでしょう
    • x87 プラットフォームを使用していない場合、これは役に立ちません
  3. クラッシュ前の j の値は、私たちと共有する良い出発点になります。

  4. pow の結果を float/double 変数に格納してみてください

    • その変数は一時的なヒープメモリの場所ではありません
    • -inf を出力する場合、-inf の場合はその変数の内部も見てください
    • (cout not pow に何か問題がある可能性があります ... )
  5. コードを最小限に抑えます(すべてを部分的にオフにします)

    • 問題が突然なくなったかどうかを確認します
    • 隠れたメモリリークとコードの上書きは悪です...

発見したことをお知らせください。

于 2013-10-29T07:57:20.100 に答える
1

入力がわずかに正常である場合、 pow が -inf を返す正当な理由は考えられません。ただし、負の数を渡す場合は、次のことを試す価値があります。

if(j==0) return 0;
if(j<0) return -pow(-j, 1.0/11.0);
return pow(j,1.0/11.0);
于 2013-10-29T07:26:04.483 に答える