ここでの回答の助言として、私は私のコードは、任意の悪い行動のgccがキャッチすることができたかどうかを確認するために-Wbad-function-cast
をオンにし、それはこの例を上げ:gccの-Wbad-function-castの目的は何ですか?
unsigned long n;
// ...
int crossover = (int)pow(n, .14);
(それはcrossover
がint
であることをここでは重要ではありません;それはunsigned long
であり、メッセージは同じであろう)。
これは、非常に普通で有用なキャストの例のようです。なぜこの問題が起こるのですか?それ以外の場合は、この警告をオンにする理由はありますか?
多くの警告を設定するのが一般的ですが、私はこのケースのユースケースを念頭に置いてはいけません。私が取り組んでいるコードは非常に数値的であり、関連するアルゴリズムのさまざまなニーズを満たすために、あるタイプから別のタイプにキャストされることが多くあります。
はい、私はその動作が欲しいので、私はキャストしています。私は 'floor'を追加するとコードが遅くなることに気付きました。特に 'cvttsd2si'ではなく、' roundsd'、そして 'cvttsd2si'を-O3で取得します。これは私のために何かしますか? (私はパフォーマンスペナルティを支払うつもりです - このアプリケーションは速度に敏感ですが、この特定の部分はホットループの外にありますが、それが何か価値がある場合のみ) – Charles
1つの具体的なアーキテクチャと(2)あなたがここで打ち切ることで何をしているのか理解していれば、この警告を無視するかオフにすることができます。クロスプラットフォーム互換性と丸めの問題について警告するために、C言語で発行されています。また、powのdouble結果が最大整数値をオーバーフローした場合、キャスト動作は未定義ですが、フロア動作は常に指定されます。 –
私は、オーバーフローが未定義の動作をもたらすことに同意します。これは悪いことです。 (これが私のサンプルコードを与えた理由です - ここではオーバーフローが不可能であることがわかります)。ありがとう、私は今受け入れています。 – Charles