1

これらの関数は通常、結果に無理数を与え、おそらくテイラー級数を介して計算されますが、これらの級数が何回繰り返されるかについてのドキュメントはありますか?
私はこれが罪であるかどうかを考えています:

public double sin(double x,int n){
    double res = 0;
    for (int i=0;i<n;i++){
        res+=Math.pow(x,i)/this.factorial(x);
    }
    return res;
}

何をすべきnですか?
これが必要なのは、自分で数学関数を作成する必要があるため、これらの操作を何回繰り返す必要があるかを知る必要があるためです。

ありがとう

4

4 に答える 4

9

Java 6の場合、ライブラリはその呼び出しのいくつか(を含む)をにMath委任します。これはクラスのドキュメントに記載されています。cosStrictMath

これらのアルゴリズムは、よく知られているネットワークライブラリnetlibからパッケージ「FreelyDistributable Math Library」、fdlibmとして入手できます。

そこで、私はfdlibmをグーグルで検索し、次にを調べましたk_cos.c。そこでの実装は、次数14の多項式で近似されます。

于 2012-09-09T22:12:11.463 に答える
4

Mathクラスのドキュメントを見てください。最大誤差は1ulpであり、ulpであると記載されています。

特定の浮動小数点形式の場合、特定の実数値のulpは、その数値を囲む2つの浮動小数点値間の距離です。

罪の場合、誤差は1ulpです。

于 2012-09-09T22:11:41.147 に答える
3

基本的な考え方は、追加する精度が小さすぎてdoubleで表現できないため、doubleが変更されなくなるまで繰り返し続けることです。

于 2012-09-09T22:11:46.590 に答える
2

計算powfactorialこの方法は非常にコストがかかり、丸め誤差が発生しやすくなります。ところで、私はあなたが意味しfactorial(i)ないと思います(x)

public static double sin(double x, int n) {
    double result = x;
    double term = x;
    for (int i = 3, n2 = n * 2; i <= n2; i += 2) {
        term *= -x * x / ((i - 1) * i);
        result += term;
    }
    return result;
}

public static void main(String... args) {
/*
    for (int i = -20; i <= 20; i++) {
        double d = i / 10.0;
        System.out.println(Math.sin(d) + " vs " + sin(d, 14));
    }
*/
    double d = -1.5;
    double sin = Math.sin(d);
    System.out.println("Searching for sin(" + d + ") = " + sin);
    for (int n = 2; n <= 14; n++) {
        System.out.println(n + ": " + sin + " vs " + sin(d, n) + " err: " + (sin(d, n) - sin));
    }
}

プリント

Searching for sin(-1.5) = -0.9974949866040544
2: -0.9974949866040544 vs -0.9375 err: 0.059994986604054446
3: -0.9974949866040544 vs -1.00078125 err: -0.00328626339594551
4: -0.9974949866040544 vs -0.9973911830357143 err: 1.0380356834016613E-4
5: -0.9974949866040544 vs -0.9974971226283482 err: -2.1360242937751295E-6
6: -0.9974949866040544 vs -0.9974949556821353 err: 3.092191913633968E-8
7: -0.9974949866040544 vs -0.9974949869361672 err: -3.321127817201841E-10
8: -0.9974949866040544 vs -0.9974949866013026 err: 2.751798788835913E-12
9: -0.9974949866040544 vs -0.9974949866040727 err: -1.8207657603852567E-14
10: -0.9974949866040544 vs -0.9974949866040544 err: 0.0
11: -0.9974949866040544 vs -0.9974949866040546 err: -1.1102230246251565E-16
12: -0.9974949866040544 vs -0.9974949866040546 err: -1.1102230246251565E-16
13: -0.9974949866040544 vs -0.9974949866040546 err: -1.1102230246251565E-16
14: -0.9974949866040544 vs -0.9974949866040546 err: -1.1102230246251565E-16
于 2012-09-10T08:14:14.740 に答える