Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 在Blackberry 4.2 JDE上调用atan函数_Math_Blackberry_Java Me_Rim 4.2 - Fatal编程技术网

Math 在Blackberry 4.2 JDE上调用atan函数

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功能,可能是因为黑莓的处理器功能不是很强大,需要大

我需要从我的Blackberry Java应用程序计算arc tan值。不幸的是,blackberry 4.2 api没有Math.atan()函数。黑莓JDE的4.6版有它,但不是4.2版


有人知道计算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;        
  }