表現可能な最大の負の浮動小数点数を指定するプラットフォームに依存しない方法は何ですか?
PS3 の SPU で実行すると壊れるアルゴリズムが見つかりましたが、PPU 用にコンパイルすると問題なく動作しました。
float x = -FLT_MAX;
/* stuff */
if (x > 0.0f) {
// If x is unchanged, code is executed on SPU
}
本質的に、明確に定義された負の同等物はありFLT_MAX
ますか?
表現可能な最大の負の浮動小数点数を指定するプラットフォームに依存しない方法は何ですか?
PS3 の SPU で実行すると壊れるアルゴリズムが見つかりましたが、PPU 用にコンパイルすると問題なく動作しました。
float x = -FLT_MAX;
/* stuff */
if (x > 0.0f) {
// If x is unchanged, code is executed on SPU
}
本質的に、明確に定義された負の同等物はありFLT_MAX
ますか?
必要ですstd::numeric_limits::lowest()
が、これはc ++ 0xのみであるため、現時点ではクロスプラットフォームではありません。
あなたは間違いなく望んでいませんstd::numeric_limits::min()
-それは最小の大きさであり、最もネガティブではありません。
常に他のすべてのdoubleよりも小さいものが必要な場合は、を使用します-numeric_limits<double>::infinity()
。
/* スタッフ */ の内容を知らなければ、ここで問題を完全に解決することはできないと思います。
ここには、浮動小数点計算に固有の問題に関する優れたスライド セットがあります: http://realtimecollisiondetection.net/pubs/GDC07_Ericson_Physics_Tutorial_Numerical_Robustness.ppt - 問題の原因に関するヒントがそこにあるかもしれません。
IEEE 754 単精度浮動小数点は、SPU と PPU では同じではありません。詳細な説明は、http://cell.scei.co.jp/e_download.htmlから入手できる SPU ISA ドキュメントの第 9 章にあります。単精度浮動小数点数の最大値も含まれます。