-2

我有一个 JavaScript 方法,我需要将它转换为标准 Java,但是我对这些行有一点问题

if (jsum) sum += bj;
jsum=!jsum;

return x < 0.0 && (n & 1) ? -ans : ans;

这显示了错误:运算符是 undefined。我知道我不能在 Java 中使用这种语法,但我不明白什么是正确的语法来保持原始目的而没有问题

完整的 JS 方法是

function bessel_fkb(n,x)
{ 
    if (n == null || n.length == 0) return "n not specified";
    var iac = 40.0;     
    var bigno = 1.0e10;
    var bigni = 1.0e-10;
    var j,jsum,m,ax,bj,bjm,bjp,sum,tox,ans;
    ax=Math.abs(x);
    if (ax == 0.0) return 0.0;
    else if (ax > n) {
        tox = 2.0/ax;
        bjm=BesselJ0(ax);
        bj=BesselJ1(ax);
        for (j=1;j<n;j++) {
            bjp=j*tox*bj-bjm;
            bjm=bj;
            bj=bjp;
        }
        ans=bj;
    } else {
        tox=2.0/ax;
        if (Math.sqrt(iac*n) >= 0)
            m=2*((n + Math.floor(Math.sqrt(iac*n))) / 2);
        else
            m=2*((n + Math.ceil(Math.sqrt(iac*n))) / 2);
        jsum=0;
        bjp=ans=sum=0.0;
        bj=1.0;
        for (j=m;j>0;j--) {
            bjm=j*tox*bj-bjp;
            bjp=bj;
            bj=bjm;
            if (Math.abs(bj) > bigno) {
                bj *= bigni;
                bjp *= bigni;
                ans *= bigni;
                sum *= bigni;
            }
            if (jsum) sum += bj;
            jsum=!jsum;
            if (j == n) ans=bjp;
        }
        sum=2.0*sum-bj;
        ans /= sum;
    }
    return x < 0.0 && (n & 1) ? -ans : ans;     
}

我的完整 Java 转换尝试是:

public double bessel_fkb(double n, double x)
    { 
        double iac = 40.0;      
        double bigno = 1.0e10;
        double bigni = 1.0e-10;
        double jsum,m,ax,bj,bjm,bjp,sum,tox,ans;
        ax=Math.abs(x);
        if (ax == 0.0) return 0.0;
        else if (ax > n) {
            tox = 2.0/ax;
            bjm=BesselJ0(ax);
            bj=BesselJ1(ax);
            for (int j=1;j<n;j++) {
                bjp=j*tox*bj-bjm;
                bjm=bj;
                bj=bjp;
            }
            ans=bj;
        } else {
            tox=2.0/ax;
            if (Math.sqrt(iac*n) >= 0)
                m=2*((n + Math.floor(Math.sqrt(iac*n))) / 2);
            else
                m=2*((n + Math.ceil(Math.sqrt(iac*n))) / 2);
            jsum=0;
            bjp=ans=sum=0.0;
            bj=1.0;
            for (int j=(int)m;j>0;j--) {
                bjm=j*tox*bj-bjp;
                bjp=bj;
                bj=bjm;
                if (Math.abs(bj) > bigno) {
                    bj *= bigni;
                    bjp *= bigni;
                    ans *= bigni;
                    sum *= bigni;
                }
                if (jsum) sum += bj;
                jsum=!jsum;
                if (j == n) ans=bjp;
            }
            sum=2.0*sum-bj;
            ans /= sum;
        }
        return x < 0.0 && (n & 1) ? -ans : ans;     
    }
4

4 回答 4

0

这个:

if (jsum) sum += bj;

应该:

if (jsum > 0) sum += bj; // or != 0

您必须引入明确的比较。

和这个:

    return x < 0.0 && (n & 1) ? -ans : ans;     

应该:

    return x < 0.0 && ((long) (n & 1) == 1) ? -ans : ans;     

JavaScript 在适当的上下文中执行非布尔类型的隐式转换,但 Java 不这样做。(编辑啊,哎呀,必须先转换为long或其他东西)

doubleto的转换long当然不一定有意义。如果 JavaScript 代码有效,那么应该没问题。当然,如果可以的话,您可以重新执行它并使“n”成为整数(或长整数)。

于 2013-05-16T23:14:46.400 回答
0

请注意,n很可能是inttype 而不是double,并且jsum最有可能是intorboolean类型。

下面的答案假设nint类型并且jsumboolean类型。

在 JavaScript 中:

jsum = 0;
...
if (jsum) sum += bj;
jsum = !jsum;

在 Java 中:

jsum = false;
...
if (jsum) sum += bj;
jsum = !jsum;

在 JavaScript 中:

return x < 0.0 && (n & 1) ? -ans : ans;

在 Java 中:

return x < 0.0 && (n & 1) != 0 ? -ans : ans;

如果n实际上需要 type double,那么您必须在使用 1 进行按位n与之前进行大小写。long&

由于 Java 具有严格的类型,因此最好弄清楚实际用法并相应地使用类型。

于 2013-05-16T23:15:13.650 回答
0

参数应该是 int,我看到的 jsum sum 就像布尔值一样使用

试试看:

public double bessel_fkb(int n, double x)
{ 
    double iac = 40.0;      
    double bigno = 1.0e10;
    double bigni = 1.0e-10;
    double m,ax,bj,bjm,bjp,sum,tox,ans;
    boolean jsum;
    ax=Math.abs(x);
    if (ax == 0.0) return 0.0;
    else if (ax > n) {
        tox = 2.0/ax;
        bjm=BesselJ0(ax);
        bj=BesselJ1(ax);
        for (int j=1;j<n;j++) {
            bjp=j*tox*bj-bjm;
            bjm=bj;
            bj=bjp;
        }
        ans=bj;
    } else {
        tox=2.0/ax;
        if (Math.sqrt(iac*n) >= 0)
            m=2*((n + Math.floor(Math.sqrt(iac*n))) / 2);
        else
            m=2*((n + Math.ceil(Math.sqrt(iac*n))) / 2);
        jsum=false;
        bjp=ans=sum=0.0;
        bj=1.0;
        for (int j=(int)m;j>0;j--) {
            bjm=j*tox*bj-bjp;
            bjp=bj;
            bj=bjm;
            if (Math.abs(bj) > bigno) {
                bj *= bigni;
                bjp *= bigni;
                ans *= bigni;
                sum *= bigni;
            }
            if (jsum) sum += bj;
            jsum=!jsum;
            if (j == n) ans=bjp;
        }
        sum=2.0*sum-bj;
        ans /= sum;
    }
    return x < 0.0 && ((n & 1) != 0) ? -ans : ans;     
}
于 2013-05-16T23:24:29.170 回答
0

你不能这样写:

return x < 0.0 && (n & 1) ? -ans : ans; 

因为(n&1)在 Java 中不是一个有效的操作,因为n是一个双精度数,所以在 JavaScript 中你可以通过这种方式测试是否n奇数,所以你只需要编写:

if(x<0.0 && (int)n%2!=0){
   return -ans;
}
else{
   return ans;
}

编辑:

你误解了jsum角色,你看不到var jsumas double,在 Java 中必须是boolean.

看着

 if (jsum) sum += bj;
            jsum=!jsum;

没有jsum意义double

于 2013-05-17T00:12:11.503 回答