【发布时间】:2019-12-16 10:49:17
【问题描述】:
我正在实现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 main(void)和int main(int argc, char *argv[])在 C 标准中给出,因此您没有编码,因此您无法定义main?使用math.h的signbit宏绝对是测试浮点数符号的正确方法,它应该算作一项基本的语言功能,而不是像使用别人的代码那样受到限制。 -
如果您不能使用
signbit,则没有完全可移植的正确解决方案。您可以将表示某个对象x的字节与表示-0.和0.的字节进行比较,这将在大多数实现中起作用(并且如果正确实现,则严格符合C 标准),但是一个实现可以有多个 -0 和 +0 表示,并且严格符合 C 代码无法了解和区分它们。
标签: c floating-point binary hex