2011-01-26 4 views
1

私の会社には、かなり大きなコードベースを備えたソフトウェアがあります。最近、gcc 4.1.2を使用してx86_64ターゲットでコンパイルするコードをチェックするタスクが割り当てられました。私はコードの非常に小さな変更を加えてコンパイルするのはかなり遠いですが、今朝ちょっと混乱したコンパイルエラーがありました。コンパイラエラー:pow(...)への不一致の呼び出し

コードでは、pow<cmath>から呼び出すと、int, unsigned int&をパラメータとして使用しています。コンパイラは、適切な一致を見つけることができないため、エラーを吐き出します。次のように<cmath>powためのオーバーロードは、以下のとおりです。

double pow(double base, double exponent) 
long double pow(long double base, long double exponent) 
float pow(float base, float exponent) 
double pow(double base, int exponent) 
long double pow(long double base, int exponent) 

私は、これは私たちの32ビット環境上に構築が、それが今のポイントの横だ理由としてはかなりSHUREありませんよ。

私の質問は:どのように私はpowを使うべきですか?ありがとう。

P.S.私はパラメータのデータ型を変更することはできません。私の任務は、コンパイルするコードを取得し、私が行ったハッキン​​グについて詳述することです。後でそのハックを調べ、適切な方法でそれらを処理することができます。

+0

おそらく、正確なコンパイルエラーを追加できますか?そして、違反行? – xtofl

+1

あなたは 'unsigned int&'をintまたはfloatにキャストできませんか?試してみてください(a、(float)b) – fazo

答えて

2

pow(int, unsigned int)に多くの電話をかけているのであれば、自分でコードを作成するのはなぜですか?実行速度が問題でない場合、それほど大きな作業ではありません。

それ以外の場合は、pow(float, float)pow(double, double)などの期待値が入力パラメータに含まれることが保証されているpow()オーバーロードを使用します。とにかく、独自のバージョンを作ることで、浮動小数点と整数の間の変換に関する問題を防ぐことができたと思います。

+1

これはいい考えです。 'unsigned int'が実際に' int'へのキャストを生き延びていることをランタイムチェックしています... – xtofl

+0

良いキャストの例を書き上げようとしていましたが、ここでキャスト変換のエラーについて述べた点は良いことです。独自のpow()関数を書くのが最善の策です。それ以外の場合は、pow((long double)a、b)を使用します。 –

+0

なぜdownvote?ただ好奇心... – Simone

1

結果は常に整数で、これらのタイプの引数を使用します。

予想される引数の範囲、特に指数に応じて、floatまたはdoubleまたはlong doubleのバージョンを選択する必要があります。

だからそれはあなたがsolvingによって式のPOW(I、UI)< max_doubleを引数の許容範囲を見つけることができます

pow((float) i, (int)ui); 

なります。

+0

私には十分だと思われる。ここにオーバーフローがある場合、それらはすでに32bバージョンに存在していました。もしあなたが絶対に確実にしたいのであれば、デバッガに元のバージョンをチェックしてそこで呼び出されたオーバーロードを確認することをお勧めします。 – Suma

関連する問題