检查double是否等于-0.00

时间:2018-11-06 14:25:54

标签: c double comparison

我正在用C编写这个大程序,这是我作业的一部分。我的问题是我的程序输出的是R --vanilla而不是x = -0.00。我已经尝试过像x = 0.00这样的比较,但我读过它不能像double那样工作。所以我的问题是还有其他方法可以检查double是否等于负零吗?

5 个答案:

答案 0 :(得分:5)

您可以使用signbit(arg)中的标准宏math.h。如果arg为负数,它将返回非零值,否则为0。

来自man page

  

signbit()是一个通用宏,可以在所有实际浮动-   点类型。如果x的值具有它的值,它将返回一个非零值   符号位设置。

     

这与x <0.0不同,因为IEEE 754浮点   允许对零进行签名。 比较-0.0 <0.0为假,但是   signbit(-0.0)将返回非零值

     

NaN和无穷大都有一个符号位。

另外,来自cppreference.com

  

此宏检测零,无穷大和NaN的符号位。沿   使用copysign,此宏是仅有的两种可移植方式之一   检查NaN的征兆。

答案 1 :(得分:4)

很少有计算实际上给您带符号的负零。您可能会观察到的是一个接近零的负值,该负值在输出该值时已被格式化选择截断。

请注意,-0.0被定义为等于0.0,因此与0.0的简单比较就足以验证带符号的零。

如果要将精确的有符号零-0.0转换为0.0,请向其添加0.0

答案 2 :(得分:3)

您的程序很可能具有较小的负值,而不是零,printf的格式为“ -0.00”。要打印“ 0.00”之类的数字,您可以测试printf将如何格式化它们并将不希望的字符串替换为所需的字符串:

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

void PrintAdjusted(double x)
{
    char buffer[6];
    int result = snprintf(buffer, sizeof buffer, "%.2f", x);

    /* If snprintf produces a result other than "-0.00", including
       a result that does not fit in the buffer, use it.
       Otherwise, print "0.00".
    */
    if (sizeof buffer <= result || strcmp(buffer, "-0.00") != 0)
        printf("%.2f", x);
    else
        printf("0.00");
}

这是便携式的。由于浮点格式的实现相关细节以及-0.005中的舍入方法,诸如将数字与printf比较之类的选择存在可移植性问题。

如果您确实想测试数字x是否为−0,则可以使用:

#include <math.h>
…
signbit(x) && x == 0

答案 3 :(得分:2)

这里需要两个功能。

首先,signbit函数可以告诉您符号位是否设置在浮点数上。其次,fpclassify函数将告诉您浮点数是否为0的形式。

例如:

double x = 0.0;
double y = -0.0;
double a = 3;
double b = -2;
printf("x=%f, y=%f\n", x, y);
printf("x is zero: %d\n", (fpclassify(x) == FP_ZERO));
printf("y is zero: %d\n", (fpclassify(y) == FP_ZERO));
printf("a is zero: %d\n", (fpclassify(a) == FP_ZERO));
printf("b is zero: %d\n", (fpclassify(b) == FP_ZERO));
printf("x sign: %d\n", signbit(x));
printf("y sign: %d\n", signbit(y));
printf("a sign: %d\n", signbit(a));
printf("b sign: %d\n", signbit(b));

输出:

x=0.000000, y=-0.000000
x is zero: 1
y is zero: 1
a is zero: 0
b is zero: 0
x sign: 0
y sign: 1
a sign: 0
b sign: 1

因此要检查值是否为负零,请执行以下操作:

if (fpclassify(x) == FP_ZERO)) {
    if (signbit(x)) {
        printf("x is negative zero\n");
    } else {
        printf("x is positive zero\n");
    }
}

答案 4 :(得分:0)

要始终获得非负版本,您根本不需要进行比较。 您可以随时获取绝对值。如果该值为非负值,则晶圆厂应返回原始值。