浮点打印出c中的负0

浮点打印出c中的负0,c,floating-point,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 flo

我正在从仪表上通过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
#包括
#包括
#包括
无符号字符cmd[]={
0x80,0x00,0x00,0x00
};
浮点字节连接(无符号字符*起始,整数大小)
{
浮动值;
数值=0;
无符号字符*p=(无符号字符*)&value;
int i,j;
对于(i=0,j=size-1;i
你知道为什么打印的是-0.000000而不是0.000000吗?这4个字符真的代表负数吗?我认为2的补码没有负0。

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

unsigned char cmd[] = {
0x00, 0x00, 0x00, 0x00
};
(但无论如何:-0.0f==0.0f)

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

unsigned char cmd[] = {
0x00, 0x00, 0x00, 0x00
};
(但无论如何:-0.0f==0.0f)

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

本文解释并证明了IEEE浮点的这一点和许多其他奇怪之处,因为你是一名计算机科学家,你应该阅读。

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


本文对IEEE浮点运算的这一点和许多其他奇怪之处进行了解释和论证,既然你是一名计算机科学家,你应该阅读。

是的。这是负零作为32位二进制浮点的表示。二的补码没有负零,但你不是在处理二的补码。注意:传感器的-0.0可能有特殊意义或微妙意义。假设压力报告为千分之0.001,但测量精度更高。不带负零的+0.0002和-0.0002等值都将舍入为0.000。了解压力是+还是-,可能很重要。读数-0.000可能表示泄漏缓慢。使用
int signbit(real floating)
macro检查其参数值的符号是否为负数,如数学上的-0.0和+0.0,使用==,>,等进行比较。这是负零作为32位二进制浮点的表示。二的补码没有负零,但你不是在处理二的补码。注意:传感器的-0.0可能有特殊意义或微妙意义。假设压力报告为千分之0.001,但测量精度更高。不带负零的+0.0002和-0.0002等值都将舍入为0.000。了解压力是+还是-,可能很重要。读数-0.000可能表示泄漏缓慢。使用
int-signbit(real-floating)
macro判断其参数值的符号是否为负数,如数学上的-0.0和+0.0,使用==,>,等进行比较。谢谢@LưuVĩnhPhúc,但这似乎是一个URL,在不确定的将来可能保持良好。(唉,我也这么认为,但我还是给了它更好的机会。)如果你想消除-0的可能性,只需加上0.0。@LưuVĩnhPhúc谢谢,但这似乎是一个在不确定的将来可能不会保持良好的URL。(就像我的一样,唉,但我还是给了它更好的几率。)如果你想消除-0的可能性,只需加上0.0。