检测在C+中存储为双精度的负0+; 我正在做一些数学运算(试图用VS2010将MATLAB代码转换成C++),我需要知道在某个时刻,如果得到否定的0。p>

检测在C+中存储为双精度的负0+; 我正在做一些数学运算(试图用VS2010将MATLAB代码转换成C++),我需要知道在某个时刻,如果得到否定的0。p>,c++,double,ieee-754,C++,Double,Ieee 754,根据IEEE标准-0/+0仅在符号位上不同(其余为0) 我使用下面的代码()将double解释为无符号字符 double f = -5; unsigned char *c = reinterpret_cast<unsigned char *>(&f); for(int i=(sizeof(double)-1); i>=0; i--){ printf("%02X", c[i]); } 但是当我尝试使用0/-0时,在这两种情况下都只能

根据IEEE标准-0/+0仅在符号位上不同(其余为0)

我使用下面的代码()将double解释为无符号字符

double f = -5;
    unsigned char *c = reinterpret_cast<unsigned char *>(&f);
    for(int i=(sizeof(double)-1); i>=0; i--){
        printf("%02X", c[i]);
   }
但是当我尝试使用0/-0时,在这两种情况下都只能得到零。VS2010声明它们符合IEEE(),所以我不确定我没有得到它的哪一部分

如果0/-0确实以完全相同的方式存储在内存中,那么如果需要,我无法区分它们,因此我应该停止浪费时间:)对吗?

如果您编写

double d = -0; 
将发生以下情况:

首先,将计算-0,它是int类型,因为0是int类型。结果将是0。然后,0将转换为double并赋值为+0.0,而不是-0.0

double d = -0.0; // is your solution.

除了Armen的好答案之外,您还应该使用signbit来检测这一点。这样做将保护您免受endian问题的影响:

#include <iostream>
#include <cmath>

int main()
{
    std::cout << std::signbit(0.0) << '\n';
    std::cout << std::signbit(-0.0) << '\n';
}

0
1
#包括
#包括
int main()
{

std::cout相同类型的函数重写为较短的形式:

static inline unsigned bool signbit(double& d)
{
    return ( ((unsigned char*)&d)[sizeof(double)-1] & 0x80) != 0;
}


int EstimateDoubleBufferSize( double& d )
{
    int len = 0;

    if( signbit(d) ) //if ( d < 0 )
    {
        d = -d;
        len++;
    }
    d += 0.0000005;

    int m = (int) log10(d);

    if( m < 0 )
        m = 1;  // 0.xxxx - include 0
    else
        m++;    // Include first character

    len += m + 1 /*dot*/ + 6 /* precision after . */;
    return len;
}
静态内联无符号bool signbit(double&d)
{
返回((无符号字符*)&d)[sizeof(double)-1]&0x80)!=0;
}
int估计DoubleBufferSize(双精度和双精度)
{
int len=0;
if(signbit(d))//if(d<0)
{
d=-d;
len++;
}
d+=0.0000005;
int m=(int)log10(d);
if(m<0)
m=1;//0.xxxx-包括0
其他的
m++;//包含第一个字符
len+=m+1/*点*/+6/*后的精度。*/;
回程透镜;
}

<我也需要找出微软C++编译器大小的SCAFTF大小包含的函数。

尝试-0而不是-0,也可以做:双D= -0D;这告诉编译器直接读取它为双:)埃蒙:我不相信它是标准的。-0是“直接读取为双”的。无论如何。我知道我是一个n00b!Thanx:)提示:即使是
-0。
(注意最后的点)也被认为是
-double
…以及
-0
。下一步将是
-。
,但不幸的是,它不是表示浮动零的有效方法。
static inline unsigned bool signbit(double& d)
{
    return ( ((unsigned char*)&d)[sizeof(double)-1] & 0x80) != 0;
}


int EstimateDoubleBufferSize( double& d )
{
    int len = 0;

    if( signbit(d) ) //if ( d < 0 )
    {
        d = -d;
        len++;
    }
    d += 0.0000005;

    int m = (int) log10(d);

    if( m < 0 )
        m = 1;  // 0.xxxx - include 0
    else
        m++;    // Include first character

    len += m + 1 /*dot*/ + 6 /* precision after . */;
    return len;
}