x和y的atan2输出为0

Nos*_*iii 2 c trigonometry angle undefined atan2

theta=atan2(0,0);
Run Code Online (Sandbox Code Playgroud)

这个语句的输出是0,但它是一个0/0形式,所以它的输出如何为0,甚至维基百科说它应该是未定义的,请解释为什么编译器给出0作为该语句的输出.

chu*_*ica 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.
Run Code Online (Sandbox Code Playgroud)

关于π的注释.π是无理数,所有有限double都是有理数的,机器pi的返回值(最接近doubleπ 表示)是预期的atan2(+0, -0).


"将x和y的atan2输出为0"

零.

"它的输出如何可以为0,甚至维基百科也说它应该是未定义的"

维基百科没有定义C也没有定义各种数学库规范 - 它是一个参考 - 而不是规范.

"为什么编译器给0"

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

  • 另请注意,如果IEC-60559兼容,标准*要求*此值(见附录F). (2认同)