对oracle数据库里数值函数ATAN2(n1,n2) 的理解。
最近学习oracle数据库,学到数值函数ATAN2(n1,n2) ,对所读书上对这个函数定义的感觉有问题,查找了一些资料,有点体会,特此记录下来。
《Oracle 10g SQL 和PL/SQL 编程指南》第8章,8.1.2 小节,对于函数ATAN2(x,y)是这样定义的:“函数ATAN2(x,y)的功能是,求X除以y的反正切值。其中自变量x可取任意值,自变量y 可取除0以外的任意数字,函数ATAN2(x,y)返回值的单位为弧度。”。
首先, 按上面定义,ATAN2(5, -1), 和 ATAN2(-5, 1) 的值应该一样,但实际上测试结果不一样:
SQL> SELECT ATAN2(5,-1), ATAN2(-5, 1) FROM dual;
ATAN2(5,-1) ATAN2(-5,1)
----------- -----------
1.76819189 -1.3734008
SQL>
其次,y 可以取零值。
SQL> SELECT ATAN2(-1,0) FROM DUAL;
ATAN2(-1,0)
-----------
-1.5707963
Syntax
Purpose
ATAN2
returns the arc tangent of n1
and n2
. The argument n1
can be in an unbounded range and returns a value in the range of -pi to pi, depending on the signs of n1
and n2
, expressed in radians.
This function takes as arguments any numeric data type or any nonnumeric data type that can be implicitly converted to a numeric data type. If any argument is BINARY_FLOAT
or BINARY_DOUBLE
, then the function returns BINARY_DOUBLE
. Otherwise the function returns NUMBER
.
感觉上面说的也比较模糊(我的英文水平较差)。查维基百科(http://zh.wikipedia.org/wiki/Atan2),觉得讲得准确:
"在三角函数中,两个参数的函数atan2是正切函数的一个变种。对于任意不同时等于0的实参数x和y,atan2(y,x)所表达的意思是坐标原点为起点,指向(x,y)的射线在坐标平面上与x轴正方向之间的角的角度。当y>0时,射线与x轴正方向的所得的角的角度指的是x轴正方向绕逆时针方向到达射线旋转的角的角度;而当y<0时,射线与x轴正方向所得的角的角度指的是x轴正方向绕顺时针方向达到射线旋转的角的角度。"
按上述定义测试,
1 先让x >0 ,比如x= 1. y 取1,0, -1。
SQL> SELECT ATAN2(1,1), ATAN2(0,1), ATAN2(-1,1) FROM DUAL;
ATAN2(1,1) ATAN2(0,1) ATAN2(-1,1)
---------- ---------- -----------
.785398163 0 -.78539816
SQL> SELECT ATAN(1), ATAN(0), ATAN(-1) FROM DUAL;
ATAN(1) ATAN(0) ATAN(-1)
---------- ---------- ----------
.785398163 0 -.78539816
2 再看 x<0 , y >= 0 的情况。让x=-1, y = 1, 和 y = 0.
SQL> SELECT ATAN2(1,-1), ATAN2(0,-1) FROM dual;
ATAN2(1,-1) ATAN2(0,-1)
----------- -----------
2.35619449 3.14159265
SQL> SELECT ATAN(-1) + 3.14159265 , ATAN(0)+ 3.14159265 FROM dual;
ATAN(-1)+3.14159265 ATAN(0)+3.14159265
------------------- ------------------
2.35619449 3.14159265
可见,在x<0 ,y>=0 时,ATAN2(y,x) = ATAN(y/x) + pi;
3 再看x < 0 , y < 0 时,设 x = -1, y = -1. y/x = 1.
SQL> SELECT ATAN2(-1,-1) FROM dual;
ATAN2(-1,-1)
------------
-2.3561945
SQL> SELECT ATAN(1) - 3.14159265 FROM dual;
ATAN(1)-3.14159265
------------------
-2.3561945
可见, 在x < 0 ,y < 0 时,ATAN2(y,x) = ATAN(y/x) - pi;
4 再看x = 0 , y > 0 时,设 x = 0, y = 1.
SQL> SELECT ATAN2(1,0) FROM dual;
ATAN2(1,0)
----------
1.57079633
SQL>
5 再看x = 0 , y < 0 时,设 x = 0, y = -1.
SQL> SELECT ATAN2(-1,0) FROM dual;
ATAN2(-1,0)
-----------
-1.5707963
6 再看x = 0, y = 0 时。
SQL> SELECT ATAN2(0,0) FROM dual;
SELECT ATAN2(0,0) FROM dual
*
第 1 行出现错误:
ORA-01426: 数字溢出
这与维基百科里讲的完全吻合。可见,书上讲的只有在特定条件下成立。
也可参看:http://en.wikipedia.org/wiki/Atan2, 讲的更详细。