0

私はJavaにかなり慣れてdouble farey_S(int N)いないので、N = 10,000まで機能するメソッドを書きましたが、N = 100,000では、オーバーフローしたかのように負の数を返します。しかし、出力のパターンから判断すると:

farey_S(10) = 6.914682539682538
farey_S(100) = 58.296238062166246
farey_S(1000) = 517.9547174126604
farey_S(10000) = 5030.839940050789
farey_S(100000) = -8366.231603179493

出力は、許容される最大値を超えるほど大きくなってはなりません。

コードは次のとおりです。

public class InverseCoprimeSum {

    public static void main(String[] args) {
        System.out.println("farey_S(10) = " + farey_S(10));
        System.out.println("farey_S(100) = " + farey_S(100));
        System.out.println("farey_S(1000) = " + farey_S(1000));
        System.out.println("farey_S(10000) = " + farey_S(10000));
        System.out.println("farey_S(100000) = " + farey_S(100000));
    }

    public static double farey_S(int N) {
        double tot = 0.0;
        int a, b, a1, b1, c, d, k;
        a = 0;
        b = 1;
        c = 1;
        d = N;
        while(c < N) {
            k = (N + b) / d;
            a1 = a;
            b1 = b;
            a = c;
            b = d;
            c = k * c - a1;
            d = k * d - b1;
            if(a < N - b)
                tot += (a + 1.0) / (a * b);
            else
                tot += (N - b + 1.0) / (a * b);
        }
        tot -= 2;
        return tot;
    }

}
4

1 に答える 1

3

乗算(a * b) は整数乗算として実行され、整数オーバーフローが発生します。

二重乗算するには、次のようにする必要があります

        ...
        if(a < N - b)
            tot += (a + 1.0) / ((double)a * b);
        else
            tot += (N - b + 1.0) / ((double)a * b);
        ...
于 2013-11-12T19:24:55.487 に答える