如果x和y都为0,atan2函数的输出结果将是什么?

5
theta=atan2(0,0);

这个语句的输出是0,但它是一个0/0的形式,那么它的输出怎么可能是0呢?即使维基百科说应该是未定义的,请解释一下为什么编译器会给出0作为此语句的输出结果。

5
C语言标准规定 atan2(0, 0)定义域错误(domain error),导致其返回值由具体实现定义。 - Oliver Charlesworth
1
严格来说,标准规定:“如果两个参数都为零,则可能会发生域错误。” 最终结果基本相同。标准还详细说明了在§7.12.1错误条件处理部分应该发生什么。 - Jonathan Leffler
1
你是在询问当行为未定义时应该期望什么样的行为吗? - underscore_d
1个回答

14

当x和y都为0时,atan2函数会返回什么

C有两个相关规范。 @Oliver Charlesworth @Jonathan Leffler

atan2函数 ... 如果两个参数都为零,则可能会发生域错误。 C11dr §7.12.4.4 2

错误条件的处理 ...对于所有函数,如果输入参数超出数学函数定义的定义域,则会产生域错误。...; 在域错误的情况下,函数返回一个实现定义的值;... §7.12.1 3

atan2(0,0) 可能导致 0.0、1.0、INF、NAN 等结果。除了返回某些值之外,没有指定其他内容。

0.0 当然是一个合理的选择,但并没有明确的数学正确结果 - 这未被定义。


为了与 IEC-60559 兼容(虽然 C 语言并不要求,但许多实现都努力遵守),以下结果是强制执行的。请注意由于 ±0 而产生的差异。

atan2(±0, −0) returns ±π
atan2(±0, +0) returns ±0.

关于π的说明。 π是一个无理数,而所有的有限double都是有理数,因此预期使用atan2(+0, -0)返回机器pi(最接近可表示的double)。


简短版

"当x和y都为0时,atan2输出的值是什么?"

零。

"即使维基百科说应该是未定义的,它的输出如何为0?"

维基百科并不定义C或各种数学库规范 - 它是一个参考 - 而不是规范。

"为什么编译器会返回0"

这是浮点标准IEC-60559/IEEE 754指定的响应,通常由各种C实现使用。


2
请注意,如果符合IEC-60559标准(请参见附录F),则标准强制规定此值。 - Oliver Charlesworth
你能否用简单的方式解释一下,我没有完全理解你说的话。 - LocalHost
@user9121710 简短回答已附上。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接