float在c中打印出负0

时间:2014-04-04 02:06:55

标签: c floating-point

我正在通过仪表读取rs-232串行线路上的字符。由于校验和字节是正确的,我100%确定这些值都是正确的。令我困惑的一件事是代表压力值的4个字节返回-0.000000。这个负面的迹象似乎并不正确。这是一个提取的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned char cmd[] = {
    0x80, 0x00, 0x00, 0x00
};

float float_byte_join(unsigned char *from, int size)
{
    float value;
    value = 0;
    unsigned char * p = (unsigned char *)&value;
    int i, j;

    for (i = 0, j = size - 1; i < size; i++, j--) {
        p[j] = *from;
        ++from;
    }
        printf("value is %f\n", value);
    return value;
}

int main(void)
{
  float_byte_join(cmd, 4);
  return 0;
}

// result:
value is -0.000000

知道为什么打印-0.000000而不是0.000000?这4个字符真的代表负数吗?我认为两个补充没有负面的0。

2 个答案:

答案 0 :(得分:4)

两个补码整数没有负零,但IEEE浮点值 do 的负值为零,并且编码为80 00 00 00 (十六进制,大端,单精度)。因此,如果这确实是您从设备获得的字节序列,那么这就是正确的结果。

这篇以及许多其他奇怪的IEEE浮点数在论文What Every Computer Scientist Should Know About Floating Point中得到了解释和论证,由于你是一名计算机科学家,你应该阅读。

答案 1 :(得分:0)

将符号位(最高有效位)设置为1,指定负数,将其更改为0.

unsigned char cmd[] = {
0x00, 0x00, 0x00, 0x00
};

(但无论如何:-0.0f == 0.0f)