oracle 数据库ATAN2(n1,n2) 的理解

对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


       所以,感觉书上说的有问题。
       那这个函数究竟是怎样定义的? 查看oracle 官网(http://docs.oracle.com)提供的解释:


Syntax

Description of atan2.gif follows
Description of the illustration atan2.gif

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轴正方向绕顺时针方向达到射线旋转的角的角度。"

函数定义[编辑]

基于值域为 \left(-{\frac  {\pi }{2}},{\frac  {\pi }{2}}\right) 的正切函数,该函数定义如下:

oracle 数据库ATAN2(n1,n2) 的理解_第1张图片


按上述定义测试,

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

可见,在x>0 时,ATAN2(y,x) = ATAN(y/x).


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>

可见,在 x = 0 , y > 0 时,ATAN2(y, 0)  = pi/2; 

5    再看x = 0 , y < 0 时,设 x = 0, y = -1. 


SQL> SELECT ATAN2(-1,0) FROM dual;

ATAN2(-1,0)
-----------
 -1.5707963

可见, x = 0 , y < 0 时,ATAN2(y, 0)  = -pi/2; 


6     再看x = 0, y = 0 时。

SQL> SELECT ATAN2(0,0) FROM dual;
SELECT ATAN2(0,0) FROM dual
       *
第 1 行出现错误:
ORA-01426: 数字溢出

可见,这个函数,不允许x,y 同时为零。

这与维基百科里讲的完全吻合。可见,书上讲的只有在特定条件下成立。

也可参看:http://en.wikipedia.org/wiki/Atan2, 讲的更详细。





你可能感兴趣的:(oracle)