Math 在Blackberry 4.2 JDE上调用atan函数
我需要从我的Blackberry Java应用程序计算arc tan值。不幸的是,blackberry 4.2 api没有Math.atan()函数。黑莓JDE的4.6版有它,但不是4.2版Math 在Blackberry 4.2 JDE上调用atan函数,math,blackberry,java-me,rim-4.2,Math,Blackberry,Java Me,Rim 4.2,我需要从我的Blackberry Java应用程序计算arc tan值。不幸的是,blackberry 4.2 api没有Math.atan()函数。黑莓JDE的4.6版有它,但不是4.2版 有人知道计算atan的解决方法吗?当所有其他方法都失败时,可以通过估计无限系列的arctan函数的结果来获得一个合适的值 有一节介绍了反三角函数的定义,包括arctan。为了获得一个估计值,我们将执行无穷级数,直到获得所需的精度 至于为什么不包括arctan功能,可能是因为黑莓的处理器功能不是很强大,需要大
有人知道计算atan的解决方法吗?当所有其他方法都失败时,可以通过估计无限系列的
arctan
函数的结果来获得一个合适的值
有一节介绍了反三角函数的定义,包括arctan
。为了获得一个估计值,我们将执行无穷级数,直到获得所需的精度
至于为什么不包括arctan
功能,可能是因为黑莓的处理器功能不是很强大,需要大量处理器资源来执行计算
另外,查看BlackBerryJDE4.2API文档,似乎有一个名为的定点数学库,它提供了两种arctan风格。它们使用32位整数执行计算,因此与执行浮点运算相比,它们可能具有一些性能优势。来源:
//计算函数
公共类计算{
//因为J2ME没有浮点数,
//需要某种定点数学。
//我的实现只是移动10个位置。
//例如,1024(>>10)=1
//和512(>>10)=0.5
公共静态final int[]AtanTable={0,1,2,3,5,6,7,8,10,11,12,
13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29,
30, 30,31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 40, 41,
42, 43, 43, 44, 45 };
///返回角度0->359(度)
公共静态整数atan(整数Y,整数X){
布尔交换=假;
int top=Math.abs(Y);
int bottom=Math.abs(X);
如果(顶部>底部){
int btemp=底部;
底部=顶部;
top=btemp;
swap=true;
}否则如果(底部==0)
返回-300;
//这将使索引保持在边界[0,45]
整数指数=(顶部*45)/底部;
int angle=AtanTable[索引];
如果(互换)
角度=90-角度;
//X&Y+=180
//X&!Y=…90
//!X&Y=…270
如果((X<0)和&(Y<0))
角度+=180;
else if(Y<0){
角度=90-角度;
角度+=270;
}else如果(X<0){
角度=90-角度;
角度+=90;
}
如果(角度==360)
角度=0;
返回角;
}
}
以下是我使用的函数(不保证它非常快):
/**从3开始的平方根*/
最终静态公共双SQRT3=1.732050807568877294;
静态公共双atan(双x)
{
布尔符号变化=假;
布尔反转=假;
int sp=0;
双x2,a;
//检查一下标志的变化
如果(x1.)
{
x=1/x;
反转=真;
}
//进程收缩域直到xMath.PI/12)
{
sp++;
a=x+SQRT3;
a=1/a;
x=x*SQRT3;
x=x-1;
x=x*a;
}
//计算核心
x2=x*x;
a=x2+1.4087812;
a=0.55913709/a;
a=a+0.60310579;
a=a-(x2*0.05160454);
a=a*x;
//处理直到sp=0
而(sp>0)
{
a=a+Math.PI/6;
sp--;
}
//反转发生了
如果(倒置)a=Math.PI/2-a;
//标志发生了变化
if(signChange)a=-a;
//
返回a;
}
首先使用泰勒级数执行标准arctan(x)
(如中所述)
在调用arctan之前,请执行以下操作:
1) 首先做这个检查
if (x == 0) {
return 0;
}
2) 如果|x |>1
,则计算arctan(1/x)
,最后从Pi/2中减去结果
3) 如果| x |
接近1
,则使用半角公式计算半角的弧tan
arctan(x)=2*arctan(x/(1+sqrt(1+x*x)))
。也就是说,首先计算半角,然后将结果乘以2。否则,对于接近1的| x |
,arctan收敛速度非常慢。我也遇到了同样的问题。。。在以下软件包中可以找到缺少的数学函数:
出于好奇,您为什么需要atan()?@Dave该函数不存在的原因是BlackBerry Java从J2ME开始,而不是从J2SE开始,这正是您在移动领域所期望的。J2ME仍然没有Math.atan()的实现。
/** Square root from 3 */
final static public double SQRT3 = 1.732050807568877294;
static public double atan(double x)
{
boolean signChange=false;
boolean Invert=false;
int sp=0;
double x2, a;
// check up the sign change
if(x<0.)
{
x=-x;
signChange=true;
}
// check up the invertation
if(x>1.)
{
x=1/x;
Invert=true;
}
// process shrinking the domain until x<PI/12
while(x>Math.PI/12)
{
sp++;
a=x+SQRT3;
a=1/a;
x=x*SQRT3;
x=x-1;
x=x*a;
}
// calculation core
x2=x*x;
a=x2+1.4087812;
a=0.55913709/a;
a=a+0.60310579;
a=a-(x2*0.05160454);
a=a*x;
// process until sp=0
while(sp>0)
{
a=a+Math.PI/6;
sp--;
}
// invertation took place
if(Invert) a=Math.PI/2-a;
// sign change took place
if(signChange) a=-a;
//
return a;
}
if (x == 0) {
return 0;
}