2

私はAndroid用の「トライアングルソルバー」アプリを書いていますが、トリガー比とラジアンメジャーの正確な値を実装できるかどうか疑問に思いました。たとえば、90度は1.57079632679ではなく「pi/2」として出力されます。

ラジアン測度の正確な値を取得するには、円周率で除算して分数に変換することを知っています。小数を分数に変換する方法がわかりません。

このような:

int decimal = angleMeasure / Math.PI;
someMethodToTurnItIntoAFraction(decimal);

三角関数の比率からどこから始めればよいのかさえわかりません。

4

4 に答える 4

1

数値を取得し、それを「特別な」数値(pi、e、sqrt(2)、sqrt(3)、sqrt(5))のそれぞれで割る必要があります。各除算の後で、結果の数値が正確な分数に近いかどうかを判断します。最後の部分を実行するには、連分数アルゴリズムを使用して、数値の適切な近似値を見つけます。連分数展開で使用して、近似がほぼ正確であるかどうかを判断できる基準があります。ほぼ正確な小さな数で素敵な分数が得られた場合、それがあなたの答えです-分数に最初に割った特別な数を掛けたものです。ああ、「1」を除数と見なすと、単純な分数も出てきます。

そこに行って、それをして、うまくいきます。連分数全体を保存して折りたたむことなくおおよその分数を取得するためのアルゴリズムを思い出せませんが、最近SOにリンクされています。

于 2011-02-10T00:37:41.597 に答える
0

あなたが話しているのは、数字の代わりに円周率を概念として使用することです。私はこのようなことをします:

class Fraction {
    public int num;
    public int den;
    public Fraction(int n,int d) {
        num=n;
       den=d;
    }
    public Fraction() {
        num=1;
        den=1;
    public double decValue() {
        return ((double)num)/((double)den);
    }
}

ヤッダ、ヤッダ....

 public static Fraction someMethod(double decVal) {
    Fraction f=new Fraction(1,1);
    double howclose=0.0000001; //tiny amount of error allowed
    while(abs((f.decValue()*Math.PI)-decVal)>howclose) {
        if(f.decValue()*Math.PI>decVal) {
            f.den++;
        }
        else {
            f.num++;
        }
    }
    return f;
}

基本的に、分数を期待される答え(decVal)にどんどん近づけるように作業します。分数は次の形式になります。

num*PI
------
den

基本的に、結果に含まれる分数にPiを掛けると、decValに非常に近くなるはずです。

于 2011-02-10T00:40:45.573 に答える
0

分数が来たときに、誰もあなたが分数を使うのを止めません。整数、倍精度浮動小数点数などは単なるオブジェクトであり、+、-、*、/の4つの演算で使用できます。ある種のオブジェクトFractionを使用できます。これは、これらの操作も実行します(演算子のようではなく、単純なメソッドのように、そのような使用例としてBigIntegerを検討してください)が、独自の方法で実行します。新しい数値タイプの作成のいくつかの側面については、 SICPを参照してください。また、Javaでの実装については、これらの注記を参照してください。

編集

私が言いたいのは、あなたを作成することではなくsomeMethodToTurnItIntoAFraction、自然の分数自体を使用することです。つまり、コードは次のようになります。

Fraction f = new Fraction(angleMeasure, Fraction.PI); 
System.out.println(f.getNum() + "/" + f.getDen());

時間がかかりますが、正確な数値が維持されます。

于 2011-02-09T23:26:58.360 に答える
0

IIRC、チップは、分数の加算の行であるテイラーの多項式を使用して三角関数を計算します。したがって、その計算を実装して、分数で保持することができます。もちろん遅くなります。

http://en.wikipedia.org/wiki/Taylor_series

于 2011-02-09T23:27:54.337 に答える