3

(願わくば) ほとんどの人が知っているように、浮動小数点演算は実数演算とは異なります。それは不正確な初心者向けです。多くの数値、特に小数 (0.1、0.3) を表すことができないため、このような問題が発生します。より完全なリストはここにあります。

実数演算に近いものを組み込みでサポートする汎用言語はありますか? そうでない場合、これをサポートする優れたライブラリは何ですか?

編集:任意精度のdecimal データ型は、私が探しているものではありません。1/3sqrt(3)、 などの数値を表現できるようにしたいです1 + 2i

4

12 に答える 12

2

私はそれを言うのは嫌ですが、Fortran。任意精度の算術を広範囲にサポートし、多数の計算を大量にサポートします。それは古くて粗雑ですが、それは仕事を成し遂げます。

于 2010-09-17T16:56:45.543 に答える
2

例で使用されているすべての数値は代数的数値であり、整数係数を持つ多項式の根として有限に表すことができます。

同じことは一般に実数については言えません。これは、実数が数えられないことを考えると簡単にわかりますが、コンピュータープログラムのセットは可算です。したがって、ほとんどの実数はコードで有限表現を持ちません。

于 2010-09-17T17:18:16.317 に答える
1

探しているのは記号計算です (MATLAB や、数学や工学で使用されるその他のツールが得意です)。

汎用言語が必要な場合は、C# の式ツリーから始めるのが良いと思います。要するに、(式を実際の値に評価するのではなく) 式を格納する機能は、記号計算を実行できるようにするための鍵です。式ツリーはシンボリック計算を提供しないことに注意してください。シンボリック計算をサポートするデータ構造を提供するだけです。

于 2010-09-17T17:26:46.397 に答える
1

有理数と複素数をサポートする言語がいくつかあります。たとえば、 Schemeには、任意の精度の有理数と、有理数、浮動小数点数、または整数係数のいずれかを持つ複素数のサポートが組み込まれています。

> (+ 1/2 1/3)
5/6
> (* 3 1+1/2i)
3+3/2i
> (+ 1/2 .5)
1.0

有理数または有理係数を持つ複素数を超えて、 e のような代数的数またはesqrt(2)のような閉じた形式の数に進みたい場合は、おそらく汎用プログラミング言語を超えて、Mathematica のような特殊目的の数学言語を使用する必要があります。マキシマ。

于 2010-09-17T19:08:14.523 に答える
1

この質問は興味深いですが、いくつかの問題が発生します。まず、カーディナリティの理由から、(理論的には無限であっても) コンピューターを使用してすべての実数を表すことはできません。

あなたが探しているのは、「記号数」データ型です。定義済みの定数、算術演算、代数 (多項式の根) および超越 (exp、sin、cos、log など) 関数を使用した、ある種の式ツリーを想像できます。

ここで、この話の面白いところは、そのような 2 つのツリーが同じ数を表しているかどうかを判断する (または同等に、そのようなツリーがゼロかどうかをテストする) アルゴリズムを見つけることができないということです。正確なことは述べませんが、ヒントとして、これは停止問題 (コンピューター科学者向け) またはゲーデル不完全性定理 (数学者向け) に似ています。

これにより、そのようなクラスはほとんど役に立たなくなります。

実数の一部のサブフィールドでは有理数の a/b や有理数の有限代数拡張 (複素有理数の a/b + ic/d、a/b + sqrt(2) * a/ b は Q[sqrt(2)] など)。これらは、代数的な数の特定のセットを表すために使用できます。

実際には、これは必要となる最も複雑なものです。浮動小数点数の範囲(特定の結果が指定された間隔内にあることを証明するため、これはおそらく実数に最も近いものです) や任意精度の数値など、特定の必要性がある場合は、どこでも自由に利用できるクラスを利用できます。boost::range前者はグーグルgmp、後者はグーグル。

于 2010-09-17T17:43:21.387 に答える
0

実数を巧みにカバーするには、シンボリック パッケージが必要です。

C++ プロジェクトである Boost にはRationalライブラリがありますが、それは話の一部にすぎません。

あらゆる種類の無理数があります (自然対数の底、平方根、立方根、シャンパーノウン定数など)。算術演算を処理するために私が知っている唯一の方法は、これらすべての数値間の関係に関するスマートなシンボリック パッケージです。e^pi を表現できると仮定すると、それに 1 を追加するにはどうすればよいでしょうか? それとも平方根を取る?

Mathematica はこれらのケースを処理するかもしれません.

于 2010-09-17T17:35:15.287 に答える
0

スキームは、有理数、bignum、浮動小数点、および複素数を定義します。それらすべてをサポートするために実装は必要ありませんが、それらが存在する場合は、それらを混在させることができ、「正しいこと」になります。

于 2010-09-17T17:35:58.553 に答える
0

ジャワ:java.math.BigDecimal

C#:decimal

于 2010-09-17T16:58:51.503 に答える
0

多くの言語がそれをサポートしています: Java はBigDecimal、Perl はMath::BigFloatMath::BigRatHaskell はInteger、多くのライブラリと言語はwikipediaにリストされています。

于 2010-09-17T17:01:13.043 に答える
0

編集: 任意精度の 10 進データ型は、私が探しているものではありません。1/3、sqrt(3)、1 + 2i などの数値も表現できるようにしたいと考えています。

Ruby には Rational クラスがあるため、1/3 は Rational(1,3) と正確に表現できます。また、Complex クラスもあります。

于 2010-09-17T17:24:44.157 に答える
0

Ada は、固定小数点演算と浮動小数点演算をネイティブにサポートしています。数値の指数が範囲内にある限り、固定小数点は浮動小数点よりもはるかに正確です。

浮動小数点が必要だが、IEEE が提供するよりも精度が高い場合は、ほぼすべての言語に対応する bignum パッケージがあります。

それがあなたにできる最善のことだと思います。どちらのスキームも、繰り返される小数 (1/3 など) を正確に表すことはできません。おそらくそうするスキームを考え出すことは可能でしょうが、組み込み型でそのようなことをサポートする言語を私は知りません。それでも、無理数 (pi や e など) では役に立ちません。どんなスキームを思いついたとしても、常に表現できない数が存在するという定理さえあると思います。

于 2010-09-17T17:03:23.380 に答える
-1

「組み込み」ではありませんが、C++(おそらくC#)が最善の策だと思います。この目的のために書かれたクラスがあります。

http://www.oonumerics.org/oon/

于 2010-09-17T17:04:10.540 に答える