我正在用C编写这个大程序,这是我作业的一部分。我的问题是我的程序输出的是R --vanilla
而不是x = -0.00
。我已经尝试过像x = 0.00
这样的比较,但我读过它不能像double那样工作。所以我的问题是还有其他方法可以检查double是否等于负零吗?
答案 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)
要始终获得非负版本,您根本不需要进行比较。 您可以随时获取绝对值。如果该值为非负值,则晶圆厂应返回原始值。