浮点数的符号

有没有一种简单的方法来确定浮点数的符号? 我进行了实验并想出了这个:
#include <iostream>

int main(int argc, char** argv)
{
 union
 {
  float f;
  char c[4];
 };

 f = -0.0f;
 std::cout << (c[3] & 0x10000000) << "n";

 std::cin.ignore();
 std::cin.get();
 return 0;
}
其中(c [3]&amp; 0x10000000)为负数给出的值> 0但我认为这要求我做出以下假设: 机器的字节大8位 一个浮点数是4个字节大吗? 机器最重要的一点是 最左边的位(字节顺序?) 如果任何这些假设是错误的或者我错过了任何假设,请纠正我。     
已邀请:
假设它是一个有效的浮点数(而不是,例如,NaN):
float f;
bool is_negative = f < 0;
它留给读者练习,以弄清楚如何测试浮点数是否为正。     
尝试
float s = copysign(1, f);
来自
<math.h>
另一个有用的东西可能是#include
<ieee754.h>
,如果它在您的系统/编译器上可用。     
使用math.h中的signbit()。     
1)sizeof(int)与它无关。 2)假设CHAR_BIT == 8,是的。 3)我们需要MSB,但是字节顺序只影响字节顺序,而不影响位顺序,所以我们需要检查的位是大字节的
c[0]&0x80
,或者
c[3]&0x80
很少,所以最好用
uint32_t
声明union并检查用0x80000000。 这个技巧只适用于非特殊的内存操作数。将其设置为XMM或x87寄存器中的
float
值将比直接逼近慢。此外,它不会处理像NaN或INF这样的特殊值。     
谷歌系统的浮点格式。许多人使用IEEE 754并且数据中有特定的符号位来检查。 1为负0为正。其他格式有类似的东西,也很容易检查。 注意尝试让编译器准确地为您提供所需的数字,使用硬编码赋值,如f = -0.0F;可能行不通。与浮点格式无关,但与解析器和编译器使用的C / C ++库有关。产生负零通常可能是也可能不是那么微不足道。     
为什么不
if (f < 0.0)
?     
我从http://www.cs.uaf.edu/2008/fall/cs441/lecture/10_07_float.html得到了这个 试试这个:
/* IEEE floating-point number's bits:  sign  exponent   mantissa */
struct float_bits {
    unsigned int fraction:23; /**< Value is binary 1.fraction ("mantissa") */
    unsigned int exp:8; /**< Value is 2^(exp-127) */
    unsigned int sign:1; /**< 0 for positive, 1 for negative */
};

/* A union is a struct where all the fields *overlap* each other */
union float_dissector {
    float f;
    struct float_bits b;
};

int main() {
    union float_dissector s;
    s.f = 16;
    printf("float %f  sign %u  exp %d  fraction %u",s.f, s.b.sign,((int)s.b.exp - 127),s.b.fraction);
    return 0;
}
    
到了这么晚,但我想到了另一种方法。 如果您知道您的系统使用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!
}
本质上,您将浮点数中的字节视为无符号整数类型,然后右移除除了其中一个位(符号位)之外的所有位。 “>>”无论字节顺序如何都有效,因此绕过了这个问题。 如果可以确定预执行哪个无符号整数类型与浮点类型的长度相同,则可以缩写:
#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);
}
这适用于我的测试系统;有人看到任何警告或忽视'陷阱'?     

要回复问题请先登录注册