無限精度の数学ライブラリはどのように実装されていますか?

StackOverflow https://stackoverflow.com/questions/1004997

  •  05-07-2019
  •  | 
  •  

質問

したがって、浮動小数点の精度(および1.1のようなものをバイナリで正確に表現できないこと)とそのすべてについて知っていますが、私は疑問に思っています:数学関連のライブラリは無限精度を実装しますか?言い換えれば、たとえば、1.1をバイナリで正確にどのように表現しますか?簡単な説明だけでも大丈夫です。正確な詳細は自分で把握できます。ありがとう。 :)

役に立ちましたか?

解決

無限精度ライブラリはありませんが、任意精度ライブラリはあります。これらの実装方法の詳細については、ドキュメントを読んでください:-)

1.1を正確にバイナリで表すには、正しく指摘するように浮動小数点を使用できません。整数部(1)を整数として、小数部(.1)を別の整数として保存し、これらの構造を処理するロジックを作成する必要がある場合に表すことができます。または、分母と分子の両方が整数として格納されている分数(11/10)として格納できます。

他のヒント

本当に無限の精度を意味する場合、2つのオプションがあります:

  • 何らかの形式の遅延計算を使用します。次に、「後」を好きなだけ正確に数字を求めることができます。計算を実行します(実際には怠laであるため、実際に実行されるだけです)。欠点は、これが非常に非効率的であることです。 Haskellのような言語では、表現が重複する特別な番号システムを使用してこれを行うことができます。数字-1、0、1の基数2

  • シンボリックに計算を行います。整数、有理数、根などを正確に表します。これは、平等を決定する場合に必要ですが、非効率的で特別な場合に限定されます。

精度が無限の数学ライブラリは実装されていません。できません。数1/3は、分数以外の有限ビット数で表すことはできません。 piやeのような超越数は、完全に表現することはできません。

一方、巨大の精度で数学ライブラリを作成することは可能です。浮動小数点値の仮数に十分なビットを割り当てるだけです。

正確な算術に依存する特定の幾何学的アルゴリズムがあります。そのため、CGALライブラリを見ると、「閉じた」さまざまな正確な数値タイプが見つかります。さまざまな操作の下で。つまり、サポートされている操作を使用して、正確に表現できない結果を生成する方法はありません。

いくつかの例:

  • 整数は、加算および乗算で閉じられます。

  • ゼロの特別な場合を除き、有理数も除算の下で閉じられます。整数のペアとして表すことができます。 GMPの有理数関数もご覧ください。例:1.1 = 11/10、(11、10)として表すことができます。

  • 同じく平方根で閉じられる数値型。

また、数値を10進数で表し、10進数の算術演算を行うこともできます。基礎となる表現は、各数字がバイナリコードで表現されるという意味でバイナリです。各桁は、小数点の左または右にかかわらず、整数として扱われます。その後、算術演算は「手動」で1桁ずつ実行されます。

10進数ベースのライブラリの1つの例は、PHPのBCMathです。

浮動小数点と数値について話しているとき、Paxはまさにここにありますが、解決策はあると思いますが、非常に非効率的です。
文字列を使用して数値を表すことができます。文字列は精度を失いません。
「0.0001」のような数字がある場合はいつでも+" 0.1"両方の文字列を反復処理し、現在の位置のみをintに変換します。
ステップ1:
0 + 0 = 0->文字列に変換してdata [0]に割り当てます。
ステップ2:
0 + 1 = 1->文字列に変換してdata [1]に割り当てます。
ステップ3:
iter> " 0.1" .lenght()->停止します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top