遅くなりましたが、別のアプローチを考えました。
システムが IEEE754 浮動小数点形式を使用していることがわかっているが、浮動小数点型が整数型に比べてどれだけ大きいかがわからない場合は、次のようにすることができます。
bool isFloatIEEE754Negative(float f)
{
float d = f;
if (sizeof(float)==sizeof(unsigned short int)) {
return (*(unsigned short int *)(&d) >> (sizeof(unsigned short int)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned int)) {
return (*(unsigned int *)(&d) >> (sizeof(unsigned int)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned long)) {
return (*(unsigned long *)(&d) >> (sizeof(unsigned long)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned char)) {
return (*(unsigned char *)(&d) >> (sizeof(unsigned char)*CHAR_BIT - 1) == 1);
}
else if (sizeof(float)==sizeof(unsigned long long)) {
return (*(unsigned long long *)(&d) >> (sizeof(unsigned long long)*CHAR_BIT - 1) == 1);
}
return false; // Should never get here if you've covered all the potential types!
}
基本的に、float 内のバイトを符号なし整数型として扱い、1 つを除くすべてのビット (符号ビット) を右シフトして存在させます。「>>」はエンディアンに関係なく機能するため、これはその問題を回避します。
どの符号なし整数型が浮動小数点型と同じ長さであるかを実行前に判断できる場合は、次のように省略できます。
#define FLOAT_EQUIV_AS_UINT unsigned int // or whatever it is
bool isFloatIEEE754Negative(float f)
{
float d = f;
return (*(FLOAT_EQUIV_AS_UINT *)(&d) >> (sizeof(FLOAT_EQUIV_AS_UINT)*CHAR_BIT - 1) == 1);
}
これは私のテストシステムで機能しました。警告や見落とされた「落とし穴」を見た人はいますか?