theta=atan2(0,0);
这个语句的输出是0,但它是0/0形式,所以它的输出如何为0,甚至维基百科说它应该是未定义的,请解释为什么编译器给出0作为此语句的输出。 / p>
答案 0 :(得分:5)
x和y的atan2输出为0
C有2个相关规格。 @Oliver Charlesworth @Jonathan Leffler
atan2函数 ...如果两个参数均为零,则可能会出现域错误。 C11dr§7.12.4.42
错误条件的处理 ...对于所有函数,如果输入参数位于定义数学函数的域之外,则会发生域错误。 ...;在一个 域错误,该函数返回一个实现定义的值; ...§7.12.13
atan2(0,0)
可能会导致0.0, 1.0, INF, NAN
等。除了返回内容之外,未指定。
0
当然是一个合理的选择,但这些数学上没有明确的正确结果 - 它没有定义。
为了与IEC-60559兼容(虽然许多实施都努力遵守,但C不要求),但要求遵循以下结果。注意由于±0引起的差异。
atan2(±0, −0) returns ±π
atan2(±0, +0) returns ±0.
关于π的说明。 π是无理数,所有有限double
都是有理数的,机器pi 的返回值(最接近可表示double
到π)与atan2(+0, -0)
一致。
“x和y的atan2输出为0”
零。
“它的输出如何为0,甚至维基百科说它应该是未定义的”
维基百科没有定义C或各种数学库规范 - 它是一个参考 - 而不是规范。
“为什么编译器给出0”
这是各种C实现经常使用的浮点标准IEC-60559 / IEEE 754的指定响应。