精度を失わずに実数を表す


10

現在の浮動小数点(ANSI C float、double)では、実数の近似値を表すことができます。エラーなしで実数
表す方法はありますか?
ここに私が持っているアイデアがあります、それは完璧ではありません。

たとえば、1/3は0.33333333 ...(base 10)またはo.01010101 ...(base 2)ですが、0.1(base 3)でもあり
ます。この「構造」を実装するのは良い考えです。

base, mantissa, exponent

したがって、1/3は3 ^ -1になる可能性があります

{[11] = base 3, [1.0] mantissa, [-1] exponent}

他のアイデアは?


12
この方法では、有理数のみを表すことができます。
Andrej Bauer 14

この表現の数値に算術演算を実装することをどのように提案しますか?対数を使用して底を変更しますか?これは、IEEE浮動小数点演算よりはるかに高価です。
David Zhang

まあ、私にはわからない。私はエンジニアではありません:)もちろん、ハードウェアに実装することはできません。Cでは低速で非効率的な実装が可能です。これは単なる実験です
14

回答:


20

それはあなたが何をしたいかによります。

たとえば、表示するのは有理数を表す優れた方法です。しかし、それでもeのようなものを完全に表すことはできません。πe

実際、HaskellやSchemeなどの多くの言語は、有理数のサポートを組み込み、それらをaの形式で格納していますここabは整数です。aba,b

これらが広く使用されていない主な理由はパフォーマンスです。浮動小数点数は少し不正確ですが、その演算はハードウェアで実装されています。提案されたシステムでは精度が向上しますが、ハードウェアで実行できる単一の操作とは対照的に、実装にはいくつかの手順が必要です。

停止中の数値など、一部の実際の数値は計算不可能であることがわかっています。十分長い時間待つ限りn番目の桁を計算できるとは異なり、その桁を列挙するアルゴリズムはありません。πn

無理数または超越数の真の精度が必要な場合は、記号代数のある種のシステムを使用し、任意の桁数に近似できる記号形式で最終的な回答を得る必要があるでしょう。ただし、上で概説した決定不能の問題のため、このアプローチは必然的に制限されます。それは、積分や無限級数の近似などに適しています。


別の質問をしてもいいですか。80年代にインテルのエンジニアであった場合、実数形式をどのように「設計」しましたか?
2014

3
私はエンジニアではないので、私は理論研究者です。IEEEのfloat規格とdouble規格、そして現在はquad規格にそれほど問題はないと思います。より高精度の演算に依存するアプリケーションは多くなく、ソフトウェアでサポートされているバージョンを使用できるアプリケーションはないと思います。
jmite 2014

シンボリック代数は、正確な実数演算の正しい形式ではありません。任意に大きい仮数を許可する表現が必要です。
Andrej Bauer 14

8
@AndrejBauer:√の正確な表現が必要な場合、任意の大きさの仮数はあなたを救うつもりはありません2
user2357112は、モニカ

@jmite控えめすぎる:)
14

22

各数値が有限表現を持つ場合、すべての実数をエラーなしで表す方法はありません。実数は数え切れないほどありますが、1と0の有限の文字列は数え切れないほど多く、それを使って表すことができます。


要件は、すべての実数を表すことから、チューリングマシンの出力である可能性があるそれらの実数のみを制限することに制限できます。それは実数の数え上げ可能な数にすぎませんが、それでも、表現したいすべての数をカバーします。しかし、私はあなたがそのような数で効率的な計算をすることができるとは思いません。
kasperd 14

3
@kasperd彼らは計算可能な実数と呼ばれています。残念ながら、平等のようなものは、計算可能な実数では計算できません。
David Richerby 14

このような数値の等式を計算することは、停止問題を解決することと同等であることは確かに明らかです。TMを指定すると、実数を定義できます。これは、ゼロの小数で始まり、TMの実行時間と同じ数で始まり、その後に1が続きます。その数をゼロに比較することは、元のTMの停止問題を解決することと同じです。
kasperd 14

この答えは誤りです。アランチューリングは、チューリングマシンを発明した最初のマシンに関する論文で、実数を無限のデータ文字列として表現することについて述べています。これはいわゆる「タイプIIチューリングマシン」のアイデアにつながり、このアイデアに基づく実数計算の理論は非常に成功しています。また、実際に実装されています。私の回答を参照してください。
Andrej Bauer 14

1
技術的にはそうかもしれませんが、実数の完全に合理的な無限表現があるという要点を逃しています。そして、それは奇妙なことではありません:TCP / IP接続、Skype通話、またはカメラからのビデオフィードはすべて、(潜在的に)無限のデータ量の例です。彼らが提供できる情報量に事前の制限はありません。限られた時間内にそこから取得できる情報の量に制限があります。
Andrej Bauer 14

7

数がベースで表現するので、あなたのアイデアは、仕事をしません仮数とMと指数E有理数であるB メートル- 電子ので、あなたの表現は、有理数となし、他人のために正確に動作します。あなたは√を表すことができませんbmebmeたとえば 22

正確な実際の算術を扱う計算可能な数学の全体の枝があります。正確な実数を表すための多くのデータ構造が提案されています:数字のストリーム、アフィン収縮のストリーム、有理数のコーシーシーケンス、2進有理数のコーシーシーケンス、Dedekindカット、縮小間隔のシーケンスなど。正確な実数演算に基づく実装があります。これらのアイデアについて、例えば:

これらのうち、iRRAMは最も成熟していて効率的です。マーシャルは実験プロジェクトですが、3番目は学生プロジェクトですが、最も簡単にアクセスできるプロジェクトでもあります。それは実数計算に関する問題を説明する非常に素晴らしい紹介を持っています、私はあなたがそれを見ることを強くお勧めします。

発言させてください。無限のオブジェクトはコンピュータでは表現できないことに誰かが反対するでしょう。ある意味これは正しいですが、別の意味ではそうではありません。実数全体を表す必要はありません。有限近似のみが必要です。計算の各段階で。したがって、必要な精度まで実数を表すことができる表現のみが必要です。もちろん、コンピュータのメモリが足りなくなると、コンピュータのメモリが足りなくなりますが、これはコンピュータの制限であり、表現そのものではありません。この状況は、プログラミングにおいて他の多くの状況と同じです。たとえば、人々はPythonで整数を使用し、利用可能なメモリのサイズを超えることはできませんが、それらを「任意に大きい」と考えています。時々、無限大は非常に大きな有限数の有用な近似です。

さらに、コンピュータは計算可能な実数しか処理できないという主張をよく耳にします。これは2つの重要なポイントを逃しています。まず、コンピューターは外部の世界からのデータにアクセスできるため、外部の世界も計算可能であると(検証できない)仮定を行う必要があります。次に、コンピュータが計算できる実数と、コンピュータが表すことができる実数を区別する必要があります。たとえば、実数の表現として数字のストリームを選択した場合、計算不可能な実数を表すことは完全に可能です。誰かが私たちにそれを与えた場合、それを表す方法を知っています。しかし、実数を数字を計算するソースコードの一部として表現することを選択した場合、明らかに、計算不可能な実数を表現することはできません。

いずれにせよ、このトピックはさらに読むことで最もうまく取り組むことができます。


+1しかし、質問で要求されているように、精度を失うことなく有限近似で無限文字列を表すことはできないと思います。確かに、必要に応じて精度を上げることができます。つまり、有理数で近似することによって可能ですが、それは質問が求めていることとはまったく異なります。間違いなく、それは答えではなく質問の問題です。
David Richerby 14

2
ポイントは、有限の文字列で表現していないということです。私たちは無限の文字列で表現していますが、計算の各段階で必要なのは、そのような無限の文字列の有限部分だけです。ありません:またはそれを別の方法で置くために何のデータ構造を保持しているとして、精度の損失は、全体の情報を、もちろん、あなたが一度にすべての情報をアクセスまたは処理することができません:あなたが求めるようなデータ構造ははるかに精度としてあなたを与えるの。ボトルネックはデータ構造の側ではなく、情報をそこから取り出したい「消費者」の側にあります。
Andrej Bauer 14

22=2k2 k222k1.99...

2
@Thomas:シンボリック計算は実数を表しませんが、通常は実数のいくつかのサブフィールド、通常は基本関数と多項式の根によって生成されるものです。これらのサブフィールドは完全ではない(コーシーシーケンスの制限の下で閉じられている)か、計算可能に完全ではありません(コーシーシーケンスの計算可能な制限の下で閉じられています)。すべての(計算可能な)実数を表現できる場合を除き、表現は実数の表現ではありません。また、シンボリック計算はこの条件に失敗します。
Andrej Bauer

1
可算実数は計算可能に数えられないので、可算性に関するこれらの発言は無関係です。
Andrej Bauer

7

多くの効果的な有理数の実装がありますが、何度も提案されており、いくつかの非合理的なものをうまく処理できるものは、継続分数です。

Darren C. Collinsによる継続分数からの引用:

定理5-1。-実数の有理式は、実数が有理である場合に限り有限です。

Mathworldからの引用-定期的な継続分数

...継続部分は、それが二次多項式の根である限り、周期的です。

つまり、すべての根は周期的な継続分数として表現できます。

また、@ AndrejBauerが実際にはそうではないことを指摘するまで私を驚かせた、πの正確な継続分数もあります。


ππ

実数の継続分数表現は、少し前に正確な実数算術の実装としてJ. Vuilleminによって提案されました。数値はすぐにかなり大きくなり、サイズを削減するのが難しいため、あまり効率的ではありません。
Andrej Bauer 14

継続分数は有理数を表す場合でもいくつかの計算上の問題があります-辞書式順序のバリアントを使用して比較的迅速に比較でき、単一の継続分数の操作は簡単ですが、CFでの(バイナリ)加算と乗算はどちらもかなり複雑な操作です実装。
Steven Stadnicki 14

5

コメントには、いくつかの「正確な」提案が含まれています(継続分数、線形分数変換など)。典型的な問題は、数式への答えを計算することはできますが、等式が決定できないことが多いことです。

ただし、代数的数値にのみ関心がある場合は、運がいいです。実際の閉体の理論は完全であり、o最小であり、決定可能です。これは1948年にタルスキによって証明されました。

しかし、落とし穴があります。Tarskiのアルゴリズムは、複雑なクラスNONELEMENTARYに含まれているため、使用しないでください。これは、非現実的なアルゴリズムが取得できるのと同じくらい非現実的です。複雑さをDEXPにまで下げる最近の方法がありますが、これは現在私たちが知っている最良の方法です。

SATが含まれているため、問題はNP困難であることに注意してください。しかし、それがNPにあることは知られていない(または信じられていない)。

編集これについてもう少し説明しようと思います。

これらすべてを理解するためのフレームワークは、Satisfiability Modulo Theories(略してSMT)として知られる決定問題です。基本的に、私たちは古典的な論理の上に構築された理論のSATを解決したいと考えています。

したがって、最初に、等価性テストを含む1次の古典的ロジックから始めます。含める関数記号とその公理は、理論が決定可能かどうかを決定します。

SMTフレームワークには、興味深い理論がたくさんあります。たとえば、プログラムが正しいことを証明するのに役立つデータ構造の理論(リスト、バイナリツリーなど)とユークリッド幾何学の理論があります。しかし、私たちの目的のために、さまざまな種類の数の理論を検討しています。

プレスブルガー算術は、加算を伴う自然数の理論です。この理論は決定可能です。

ペアノ演算は、加算と乗算を伴う自然数の理論です。ゲーデルによって有名に証明されたように、この理論は決定可能ではありません。

タルスキ演算は、すべてのフィールド演算(加算、減算、乗算、除算)を伴う実数の理論です。興味深いことに、この理論は決定可能です。これは当時、非常に直観に反する結果でした。これは自然数の「スーパーセット」であるため、「より難しい」と考えるかもしれませんが、そうではありません。たとえば、有理数の線形計画法と整数の線形計画法を比較してください。

満足度があなたが必要とするすべてであることは明らかではないかもしれませんが、それはそうです。たとえば、2の正の平方根が3の実際の立方根と等しいかどうかをテストする場合、これを充足可能性の問題として表すことができます。

x.x>0x22=0x33=0

ex

sin{xπ|sinx=0}sin

exeix


Alfred Tarski(1948)、初等代数と幾何学のための決定方法


2

多項式の根として扱うことにより、代数的数と呼ばれる非常に大きな数のクラスを正確に表すことが可能です。

πe


eeixsincos{xR|sinx=0}

@Pseudonymこれは本当に興味深いようですが、正しく理解するための数学的背景がないと思います...「整数に十分近い」とはどういう意味ですか?
より多くの軸2014

説明のために私の答えを修正します。
仮名2014

1

π2


この答えは誤りです。コンピューターで実数を表現する方法を説明する正確な実数計算の領域全体があります。実数は有限の文字列で表現されなければならないという仮定は誤っています。無限の文字列を使用することもできます。すでにアラン・チューリングは、彼の最初の論文でこれについて書いており、彼がチューリング機械を発明したのです!
Andrej Bauer 14

実際のコンピュータで無限の文字列を保存および操作する方法についての論文にリンクしていただけませんか。それが質問の答えです。また、それは彼の最初の論文ではなく、最初の出版は1936年で、その論文は1937
でした。– lPlant 14

そうです、1937年の論文です。無限の文字列がどのように操作されるかを確認するには、たとえば、TCP / IPプロトコルを調べます。実在物全体をコンピューターに保存する必要があるとは言いませんでした。
Andrej Bauer

-1

コンピュータですべての実数を表すことはできませんが、多数を表すことはできます。浮動小数点数よりも多くの数を表す分数を使用できます。また、ニュートン法で数値に収束する近似を使用して、いくつかの多項式の根として数値を表すなど、より洗練された処理を行うこともできます。


これもまた、無知から生まれた誤った答えです。適切なデータ構造ですべての実数を表現する方法を研究する正確な実数計算の領域全体があります。
Andrej Bauer 14

@AndrejBauerでは、実数を表すことができるデータ構造があることを示唆していますか?このようなデータ構造では、数を表すために数え切れないほどのビット数を使用する必要があります。
アリスリル2014

1
可算すべての最初のビットで十分の量と、一度にそれらのすべてを必要としない、またあなたはすべてを一度にそれらを処理することができますので、時間だけでなく、空間に格納することができます。
Andrej Bauer 14

@AndrejBauerこの答えは正解です。情報はかなり少なくなりますが、あなたと同じことを言ってください。コンピュータですべての実数を表すことはできません。任意の実数を表すことができますが、一度にすべてを表すことはできません。どちらかと言えば、あなたは「多くの」を表すことができるということに異議を唱えます。なぜなら、特定のコンピューターでは有限の数しか表すことができず、通常の計算モデル(Turingマシン相当)。
Gilles「SO-邪悪なことをやめ

-1

入力を操作の文字列として格納することにより、入力を表すことができる場所で任意の数を正確に表すことができます。たとえば、1/3として保存し1 divided by 3、操作のキャンセルを処理することにより、次の操作を簡略化しての正確な答えを得ることができます(1/3) * 3。これはπ、計算に保持するなど、不合理なことがわかっている状況にも対応できます。

ただし、数値ごとにメモリの量を増やす必要があります。また、単純化器が完全ではないと仮定すると、多くの作業をしている値に対して、ますます多くの量が必要になります。


5+262=3
ベンミルウッド2014

確かに。実際、完全に正常に自動化することはおそらく事実上不可能です。ただし、可能な限り単純な表現を使用しなくても、結果は正確なままです。
Jack Aidley、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.