-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最初にまたは何かに変換する必要があります)

doubleもちろん、 からへの変換longは必ずしも意味のあるものではありません。JavaScript コードが機能する場合は、問題ありません。もちろん、それが機能する場合は、やり直して "n" を整数 (または long) にすることもできます。

于 2013-05-16T23:14:46.400 に答える
0

はではなくタイプでnある可能性が高く、またはタイプである可能性が最も高いことに注意してください。intdoublejsumintboolean

以下の答えは、タイプであり、タイプであると想定nしています。intjsumboolean

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実際に typedoubleが必要な場合は、1 でビットごとの AND を実行nする前に to を使用する必要があります。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は double である(n&1)ため Java では有効な操作ではないため、JavaScript ではこの方法で が奇数かどうかをテストするため、次のように記述するだけです。n

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

編集:

jsum役割を誤解しているためvar jsumdoubleJava ではboolean.

見る

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

doublejsumとして意味がありません。

于 2013-05-17T00:12:11.503 に答える