我正在实现printf()
函数。几乎所有的东西都能正常工作,但是当被称为ft_printf("%f", -0.0)
时,我有一个问题。我的程序输出0.0
而不是-0.0
。我不能用任何图书馆。
我检查消极性的条件只是“xDistinguish zero and negative zero中找到了一个有前途的解决方案。
这似乎能解决我的问题:
double a = -0.0;
printf("%d\n", (*((long *)&a) == 0x8000000000000000));
我想让这个程序打印
1
,但在我的程序中,当我在代码中打印时,它会输出0
。我有一个问题,那就是:*((long *)&a)
如何使一个数字与它的十六进制对应数相比较。 最佳答案
这类似于我完成的暗战卡塔。诀窍是用要检查的数字除以负零,如下所示:
int isPositiveZero(double a) {
return 1/a == 1/0.0;
}
如果
-infinity
为负零,除法给出a
,如果infinity
为零,除法给出a
。如果你想按自己的方式做,请尝试以下操作:
(*((long *)&a) & 0x8000000000000000)
注意,这违反了严格的别名规则,这会导致未定义的行为。这意味着你的程序可以做任何事情,从打印正确的结果到让你的计算机长出翅膀飞走。
如果您有可用的
math.h
并且不反对使用标准C库中的宏,那么这个解决方案(使用signbit
)也将起作用(并且更具可移植性):#include <math.h>
int isPositiveZero(double a) {
return a == 0.0 && !signbit(a);
}