質問

ほとんどの数学者は次のことに同意しています。

eπi + 1 = 0

ただし、ほとんどの浮動小数点実装はこれに同意しません。この論争をどれだけうまく解決できるでしょうか?

さまざまな言語や実装、そして結果をできるだけゼロに近づけるためのさまざまな方法について聞きたいと思っています。クリエイティブに!

役に立ちましたか?

解決

ほとんどの浮動小数点実装が同意していないわけではなく、100% の答えを得るのに必要な精度が得られないだけです。そして正しい答えは、それはできないということです。

PI は、シンボリック表現以外では誰も表すことができなかった無限の一連の数字であり、e^X も同様であるため、100% の精度に達する唯一の方法はシンボリック表現を使用することです。

他のヒント

これは私が試した実装と言語の短いリストです。ゼロに近い順に並べ替えられます。

  • スキーム: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (シェスキーム、MITスキーム)
    • 0.0+1.22460635382238e-16i (ガイル)
    • 0.0+1.22464679914735e-16i (チキンと numbers 卵)
    • 0.0+1.2246467991473532e-16i (MzScheme、SISC、Gauche、Gambit)
    • 0.0+1.2246467991473533e-16i (SCM)
  • 共通Lisp: (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20) (クリスプ)
    • #C(0.0d0 1.2246063538223773d-16) (CMUCL)
    • #C(0.0d0 1.2246467991473532d-16) (SBCL)
  • パール: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • パイソン: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j (CPython)
  • ルビィ: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16) (MRI)
    • Complex(0.0, 1.2246467991473532e-16) (JRuby)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i

この紛争を解決することは可能でしょうか?

私が最初に考えたのは、次のような記号言語に注目することです。 メープル. 。ただし、それは浮動小数点としてカウントされないと思います。

実際、どうやって表現するのか (または j エンジニア向け)従来のプログラミング言語で?

おそらく、より良い例は sin(π) = 0 でしょうか?(それともまた要点を見逃してしまったのでしょうか?)

私も Ryan さんの意見に同意します。別の数値表現システムに移行する必要があるでしょう。解決策は浮動小数点演算の範囲外です。円周率を無限長の 10 進数として表現する必要があるため、精度が制限されたスキームは機能しません (少なくとも、失われた精度を補うために何らかのごまかし要素を使用しない限りは機能しません)。精度)。

浮動小数点演算が言語によって実装されることを示唆しているようですので、あなたの質問は私には少し奇妙に思えます。FP 演算はハードウェアの浮動小数点プロセッサを使用して実行されるため、これは一般的には当てはまりません。しかし、ソフトウェアでもハードウェアでも、浮動小数点は常に不正確になります。それがフロートの仕組みです。

より高い精度が必要な場合は、別の数値表現を使用する必要があります。int または long に収まらない数値に対して整数計算を行う場合と同様です。一部の言語にはそのためのライブラリが組み込まれていますが (Java には BigInteger と BigDecimal があることは知っています)、ネイティブ型の代わりにこれらのライブラリを明示的に使用する必要があり、float を使用する場合よりもパフォーマンスが (場合によっては大幅に) 低下します。

@ライアン・フォックス

実際、従来のプログラミング言語では i (エンジニアの場合は j) をどのように表すのでしょうか?

ネイティブの複雑なデータ型は決して知られていません。Fortran は 60 年代半ばまでにそれを実現しており、OP はその後のフォローアップでそれらをサポートする他のさまざまな言語を示しています。

また、複素数をライブラリとして他の言語に追加することもできます (演算子のオーバーロードを使用すると、コード内ではネイティブ型のように見えることさえあります)。

しかし、この問題に対する特別なケースを提供しない限り、「不一致」は単に機械演算が不正確であることを表しているだけですよね?と文句を言っているようなものだ

float r = 2/3;
float s = 3*r;
float t = s - 2;

(t != 0) で終わります (少なくとも十分に愚かなコンパイラを使用している場合)...

私は親友と無理数や他の数の差について長時間コーヒーチャットをしました。さて、私たち二人とも、次のような異なる観点で同意します。

無理数は、ある意味、関数としての関係です。さて、「完璧な円が欲しいなら、完璧な円周率をください」について考えてみましょう。しかし、円は他の図形 (4 辺、5、6...) とは異なります。100、200) でも...あと何辺あると円に見えますか?ここまで私をフォローしてくれた方は、このすべてのアイデアをここで結び付けると、円周率の公式がわかります。enter image description here

つまり、円周率は関数ですが、決して終わることはありません。∞ パラメータがあるためですが、非常に大きな Int の ∞ パラメータを変更すると、非常に大きな pi インスタンスが得られるため、円周率の「インスタンス」を作成できると思います。

e も同様です。巨大なパラメータを与えてください。私はあなたに巨大な e を与えます。

すべてのアイデアをまとめると次のようになります。

メモリの制限があるため、言語とライブラリは無理数の巨大なインスタンスを提供します。この場合は pi と e です。最終結果として、@Chris Jester-Young が提供する例のように、0 を取得するには長いアプローチが必要になります。

実際、従来のプログラミング言語では i (エンジニアの場合は j) をどのように表すのでしょうか?

ネイティブ表現を持たない言語では、通常、OOP を使用して追加され、 Complex 表すクラス i そして j, 、他の操作が関与する操作を適切に処理するために演算子をオーバーロードします。 Complex 数値や言語固有のその他の数値プリミティブ。

例えば: 複雑な.java, C++ <複雑>

数値分析は、大きな数値間の小さな差の正確な値に依存できないことを教えてくれます。

これは、ここで問題としている方程式に影響を与えるだけでなく、ほぼ特異な連立方程式の集合を解くことから、多項式の零点を求めることから、log(~1) や exp(~0) の評価に至るまで、あらゆるものに不安定性をもたらす可能性があります (これを回避するために log(x+1) と (exp(x)-1) を評価する特別な関数も見たことがあります。

差をゼロにするという観点ではなく、誤差を最小限に抑えるような方法で関連する計算を行うことをお勧めします。

申し訳ありませんが、大学でこれを叩き込まれてから 43 年も経ちます。たとえ参考文献を覚えていたとしても、今ではもっと良いものがあるはずです。私は提案します これ 出発点として。


少し恩着せがましく聞こえるかもしれませんが、ごめんなさい。当時は CS があまりなかったため、私の「数値解析 101」は化学コースの一部でした。私は、現代の CS コースにおける数値分析の位置づけや重要性については、あまり実感がありません。

これは、現在の浮動小数点計算アーキテクチャの制限です。浮動小数点演算は、e や pi などの数値極 (またはビットが許容する精度を超えるもの) の近似にすぎません。これらの数値は分類を無視しており、正規系列である素数よりも大きなエントロピー (?) を持っているように見えるため、私は本当に楽しんでいます。比率は数値表現に反して、時にはそのような単純なことが人の心を驚かせることがあります(私はそれが大好きです)。

幸いなことに、言語とライブラリ全体は、(次の記述で説明されているものと同様の) 記法概念を使用することで、高精度三角関数専用にできます。 ラッセ V.カールセン ).

e や pi などの概念を機械が理解できる形式で記述するライブラリ/言語を考えてみましょう。機械には真円とは何かという概念があるのでしょうか?おそらくそうではありませんが、オブジェクトに帰属する既知の特徴をすべて満たす円 (一定の半径、半径と円周の関係は 2*pi*r = C) を作成することはできます。pi のようなオブジェクトは、前述の比率によってのみ記述されます。r と C は、任意の精度で記述された数値オブジェクトにすることができます。e は、「e は点 x = 0 における関数 f(x) = ex の導関数 (接線の傾き) の値が正確に 1 となるような固有の実数であるため」と定義できます。 ウィキペディア.

楽しい質問。

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