2011-01-13 7 views
5

任意の小数を正確な小数(323527/4362363のようなもの)に変換するのではなく、簡単に識別できる一般的な1/2,1/4,1/8などの量)10進数を「かなり」の小数に変換するための最適化アルゴリズム

if-then、equal/equal toなどの比較を使用する以外に、これを行うための最適化手法がありますか?

編集:私の特定のケースでは、近似値は許容されます。私の使用例では0.251243〜0.25 = 1/4 - ということが考えられます。これは "十分に良い"ことです。後者は、人間の読みやすさの観点からは、速いインジケータ(計算には使用せず、単にディスプレイの数値として使用します)

+0

あなたの質問は曖昧です。どのように人間の可読性を定義しますか?さらに重要なのは、人間が読める同等の形式がない場合はどうでしょうか?あなたは近似を許可しますか?私は個人的には、近似に頼ることなく、あなたの例題323526/4362363を人間が読める形式で書く簡単な方法は見当たりません。 –

+0

近似は許容されます - 4桁の10進数の精度は十分です。 – ina

+0

どちらかの数字の長さだけでは、人間が判読できるものがあります。一般に「1/x」という形式の小数は* easy *ですが、「4/85」は単なる奇妙なもので、「1/41」と表現する方がよいでしょう。もちろん、 "1/x"ファミリは0.5より小さい数ではうまく働き、大きな損失を意味する0.4を使って近似すると、おそらく百分率表現で十分でしょうか? –

答えて

3

ユークリッドアルゴリズムを使用すると、列挙子と分母の間で最大公約数を得ることができます。

+0

分母を107842/1454121のようなケースを避けるために制限することをお勧めします。 – coreyward

+0

mea culpa - 最初の小数点は... 6の代わりに7を意味しました;-) – ina

+0

なぜ人々がこれを投票していますか?これは全く質問に答えません。彼は分数を減らすことではなく、単純な分数に近似することを求めています。 –

7

「連続近似」を参照してください。ウィキペディアには、「継続分数」記事の基本的な紹介がありますが、分数を生成しながら近似値を生成する最適化アルゴリズムがあります。

次に、分母のサイズと近似の近さの組み合わせをいくつか選択します。これは、「十分に近い」ときのためです。

0

以下では、私たちの小数点は0と1の間にあると仮定します。これをより大きな数と負の数に適合させるのは簡単です。

おそらく最も簡単なことは、許容できると思われる最大の分母を選択し、その分母がそれらよりも小さいか等しい0と1の間の分数のリストを作成することでしょう。簡素化できる部分は避けてください。明らかに、あなたが1/2をリストアップすると、2/4は必要ありません。分子と分母のGCDがユークリッドのアルゴリズムに従っていることを確認することで、簡略化できる分数を避けることができます。一度あなたのリストを持っています。これらを浮動小数点数として評価します(おそらく倍精度ですが、データ型はプログラミング言語の選択によって異なります)。次に、元の分数と小数部の浮動小数点の評価の両方を格納している平衡二分探索木にそれらを挿入します。初期状態を設定するためにこれを一度だけ行う必要がありますので、n * log(n)時間(nは端数です)はそれほど大きくありません。

次に、数字が表示されたら、ツリーを検索して、検索ツリーに最も近い番号を見つけます。探しているノードがリーフノードではない可能性があるため、これは完全一致の検索よりも少し複雑です。したがって、あなたが訪問した最も価値のあるノードの記録をツリーを横切るようにトラバースします。リーフノードに到達し、そのリーフノードを訪問した最も近いノードに比較すると、完了です。どちらがあなたの最も近いものであっても、それはあなたの答えです。ここ

0

が提案である:あなたの出発画分は有理(浮動小数点)値(例えばようなP/Q

  1. 計算R = P/Qであると仮定するとR =フロート(P)/フロート(Q))

  2. xおよび10000の丸い小数X = INT(10000 *のR)

  3. 計算GCD(最大公約数)を計算する:S = GCD( X、10000)

  4. M/Nここで、m = xで/ sであり、n = Y/Sとして結果を表し(あなたの例371/5000の計算)

通常、1000のすべての分母かなり人間が読める。

これは、値が1/3などのより単純なケースに近い場合、最良の結果を提供しない可能性があります。しかし、私は個人的に37/1000を47/62よりもはるかに人間が読める(これは最短の部分表現です)。このようなプロセスを微調整するためにいくつかの例外を追加することができます(たとえば、p/GCD(p、q)、q/GCD(p、q)を計算し、

0

ほんの一部 "プレビュー" のためのプリティダムソリューション、:

 
factor = 1/decimal 
result = 1/Round(factor) 
mult = 1 

while (result = 1) { 
    mult = mult * 10 
    result = (1 * mult)/(Round(mult * factor)) 
} 

result = simplify_with_GCD(result) 

幸運を!

関連する問題