web-dev-qa-db-ja.com

浮動小数点数がサイエンス/エンジニアリングで頻繁に使用されるのはなぜですか?

浮動小数点数の正確さを調査している間、私はいくつかの場所で次のようなステートメントを見ました

"floatとdouble aredesigned for/used in in工学および科学計算 "

私の理解では、浮動小数点数と倍精度浮動小数点数の強さは、(正確ではあるが完全ではない)精度のために使用するメモリの量です。

私はこれからほとんど理解を得ているように感じます answer

"浮動小数点数を使用すると、連続量をモデル化できます"

私はまだ私が理解していると確信していません。工学と科学はどちらも、計算結果preciseが必要なフィールドのように聞こえますが、私の理解では、浮動小数点では得られません。また、「連続量」が正確に何であるかについてもわかりません。

誰かがこの説明を拡張して、例を示すことができますか?

34
DoubleDouble

科学と工学の計算には、精度、範囲、速度のトレードオフが必要です。固定小数点演算は精度とまともな速度を提供しますが、範囲を犠牲にします。 BigNum、任意精度ライブラリは、範囲と精度には勝ちますが、速度には負けます。

問題の核心は、ほとんどの科学および工学計算が高速で広い範囲を必要とするが、精度に対する要求は比較的控えめであることです。最もよく決定された物理定数は約13桁しか知られておらず、多くの値はあまり確実ではなく知られていまコンピューターの精度が13桁を超えていても、それは役に立ちません。軟膏のフライは、浮動小数点演算のシーケンスが徐々に精度を失う可能性があることです。数値分析のパンとバターは、特にこの問題の影響を受けやすい問題を特定し、問題を減らすために操作のシーケンスを再配置する巧妙な方法を特定しています。

これの例外は、数百万桁の数値に対して絶対精度で算術演算を実行する必要がある数学の数論です。数値理論家はBigNumライブラリをよく使用し、計算に時間がかかります。

78

代替何を提案しますか?

連続量は、数学では実数を使用して表されます。エンコードできるデータ型はありませんすべて可能実数(実数は数えられないため)。つまり、最も関心のある実数のサブセットのみを選択できます。

  • コンピューター代数システム(CAS)と同じように、すべての計算可能な実数を選択できます。問題は、式ツリーが大きくなるにつれて、急速に実行不可能になることです。それも非常に遅いです:Mathematicaで微分方程式の巨大なシステムを象徴的に解いてみてくださいそして他のいくつかの浮動小数点ベースの実装と比較すると速度に劇的な違いが見られます。さらに、JörgW Mittagとkasperdが指摘したように、決定可能な等値/比較演算さえありません。

  • 正確な有理数を使用することもできますが、平方根、余弦、対数などを計算する必要があるため、多くのアプリケーションでは実際には機能しません。さらに、有理数がますます複雑になり、格納するためにより多くのスペースが必要になる傾向もあります。そして、それらに対してますます多くの計算を実行するときに処理する時間。

  • 任意精度の小数を使用することもできますが、桁数が無限に繰り返されるため、除算のような単純なものでも機能しません。また、有理数に似ていますが、程度は低くなりますが、複雑さが増すという問題に遭遇することもあります。

したがって、ある時点で近似を使用せざるを得なくなります。その場合、浮動小数点数が最も効果的です。浮動小数点数も固定幅です(前述の他のすべての3つのデータ型とは異なります)。これにより、計算を実行するにつれて複雑さが増すのを防ぎます。

30
Rufflewind

科学についてのあなたの命題は間違っています、数学以外の工学と科学は正確な正確な結果で機能しません。これらは、表示する桁数に組み込まれている精度係数で動作します。

ここで理解する必要のある重要な用語は次のとおりです 有効数字 。数値の有効数字は、その精度に寄与する意味を持つ桁です。

つまり、基本的に何かが12センチメートルの長さであると述べた場合、それは実際には11.5センチメートルと12.5センチメートルの間の長さになる可能性があります。しかし、私が何かが12.00センチメートルの長さであると述べた場合、それは、11,995センチメートルから12,005センチメートルの間のどこかにある可能性があります。

実例として、測定テープを取り、リビングを測定するとします。幅が6メートル25センチメートルであることがわかるかもしれませんが、テープの測定値は、ミリメートルの精度またはナノメートルの精度について何でも伝えるほど正確ではなかったことがわかります。

14
Pieter B

浮動小数点数は基本的にscientificおよびengineering表記と同じです。これは、人間が数学や科学で数値を書くための標準的な方法です。これらのフィールドでは、極端な精度はそれほど必要ありませんが、hugeの範囲がよくあります。

私の物理学の宿題からランダムな例を選ぶために、私は最近、およそ9.11 * 10 ^ -31 kgの電子の質量を扱う必要がありました。精度についてはあまり気にしません。それは私が気にするすべてにとって簡単に9.12になる可能性があります。しかし、私は指数を気にし、0.0000 ... 911 kgを書き出す必要がないので、科学表記法を使用します。

同様の推論が科学およびエンジニアリングコンピューティングにも当てはまります。非常に広い範囲がありますが、非常に大きな数を格納して処理する必要がないため、正規化された値と指数を格納します。

7
raptortech97

浮動小数点数には、特定の種類の科学的結果の計算に役立ついくつかの特性もあります。最も重要なのは、科学表記法と同様に、精度はマグニチュードに反比例するため、ゼロに近い小さな差とはるかに離れた大きな差の両方を表すことができます。

ゴールドバーグの論文 はおそらく浮動小数点数の特性の最も有名な分析です(そして、この種のことを気にかけている場合は読む必要があります)しかし Kahanの論文 I微妙な設計問題の多くの背後にある理論的根拠を説明するより良い仕事をすることを考えてください。

特に、Kahanの Javaの浮動小数点の実装に関するダイアトリブ は非常に刺激的ですが、IEEE-754セマンティクスが有用である理由についていくつかの良い点を示しています Much Ado About Nothing's Sign Bit 符号付きゼロの理論的根拠をかなり詳しく調べます。

6
Daniel Pryden

TL; DRほとんどの関数を完全な精度で計算する方法がわかりません。したがって、完全な精度で数値を表すポイントはありません。

これまでのすべての回答は、最も重要なポイントを逃しています。ほとんどの数値の正確な値を計算することはできません。重要な特殊なケースとして、指数関数の正確な値を計算することはできません。最も重要な無理関数のみを引用することはできません。

素朴な質問に対する素朴な答え

あなたの質問はむしろ「正確な算術ライブラリーがあります。浮動小数点演算の代わりにそれらを使用しないのはなぜですか?」答えは、正確な算術は有理数で機能し、次のとおりです。

  • アルキメデスの数—πの教訓的な名前—は合理的ではありません。
  • 他の多くの重要な定数は合理的ではありません。
  • 他の多くの重要な定数は、合理的であるかどうかさえ知られていません。
  • ゼロ以外の有理数xの場合、数値exp(x)は無理です。
  • 同様のステートメントは、科学者にとって重要な根、対数、および豊富な関数(ガウス分布、そのCDF、ベッセル関数、オイラー関数など)にも当てはまります。

有理数は幸運な事故です。ほとんどの数値は有理数ではないため(Baireの定理を参照)、数値を計算すると常に合理的な世界から抜け出すことができます。

数値の計算と表現とは何ですか?

「OK、問題は、有理数は実数を表すのにそれほど良い選択ではなかったということです。」と反応するかもしれません。それから、私たちは自分の切り株 fork Debian をロールアップし、実数の新しい表現システムを考案します。

数値を計算する場合は、実数の表現システムを選択し、それらの重要な演算を説明する必要があります。つまり、computingの意味を定義します。私たちは科学計算に関心があるので、すべての10進数(私たちのメジャー)、その商(有理数)、指数関数の値、およびアルキメデス数などのいくつかの面白い定数を正確に表現したいと考えています。

問題は、そのようなシステムで数値を完全に表現する唯一の方法は、シンボリック形式を使用することです。つまり、何も計算せず、代数式を処理することです。 2つの数値(どちらか大きい方)を確実に比較できないため、これは実数のかなり不正確な表現です。 「与えられた数は0に等しいですか?」という質問に簡単に答えることはできません。

たとえば、より正確な数学的定義と問題を探す場合は、有理数、超越数、最良の近似、ベイルの定理などを探します。

なぜなら

1)著者は、「工学的および科学的計算」が実際の物理量を測定することを前提としています。

2)物理量は連続的であり、「浮動小数点数を使用すると連続的量をモデル化できる」とあなたが述べたとおり

..そして、私の答えの残りは Rufflewindでうまくまとめられます なので、ここでは繰り返さないことにします。

0
Jan Doggen

浮動小数点数は相対的な精度を提供します。これらは、広い範囲の正確な数値から最大でも小さなパーセンテージ(0.0000000000001%のようなものを呼び出したい場合)の数値を表すことができます。彼らはこの特性を計算尺と共有しますが、後者は3桁の精度よりも優れていません。それでも、デジタルコンピューターが一般的になる前に、大規模な構造の静的および動的な力を計算するには十分でした。これは、材料定数にもばらつきがあり、材料や構造の違いに対して合理的に無害な構成を選択する傾向があるためです。最大負荷と弱点を合理的に特定できるようにするため。

「精度」は、物理的特性の測定値や大きさを表す多くの数値にとって有用な機能です。

科学/工学のすべてがそのカテゴリーに属するわけではありません。たとえば、数値理論変換を使用して大きな数を乗算したり、ガロア体を使用してエラー訂正多項式を操作したりする場合、小さなエラーなどはありません。処理中の単一ビットエラーは、完全にランダムなものとまったく区別できない結果になります。ノイズ。

これらの領域でも、エラーの累積を追跡し、浮動小数点エラーが単一ビットを反転させるほどの大きさを累積しないようにすれば、(畳み込みを行うために複雑なFFTを使用するなど)浮動小数点数を処理できます。それらが近似である実際のエンティティ。このような近似の場合、固定小数点処理の方が適切ですが、フィールド内の浮動小数点ユニットは、より高速な操作と多数の使用可能なビットを提供する傾向があります。

また、CやFortranのようなプログラミング言語では、混合精度の乗算と除算、または加算/減算のキャリービットなどの基本演算にアクセスするのが驚くほど難しくなります。

したがって、操作を浮動小数点数にマッピングできる場合、最近はかなり強力なハードウェアを自由に使える傾向にあり、今日の汎用プログラミング言語の1つでアルゴリズムを適切に指定できます。

0
user153796

これは、float/doubleデータ型が適していないアプリケーションに対処することで解決できると思います。

特定の桁数で正確に数値を表すことができることを確認する必要がある場合、浮動小数点数は、10の累乗ではなく2の累乗として数値を表すため、不適切です。現実の世界。

したがって、浮動小数点データ型を使用してはならない1つのドメインは、finance *のドメインです。例えばのコアシステムのために銀行の場合、$ 100000.01であったはずの金額が突然$ 100000.00または$ 100000.02になった場合、まったく受け入れられません。

このような問題は、特に数値が1つ以上の計算の結果である場合、フロートを使用するときに簡単に発生する可能性があります。アカウント内のすべてのトランザクションの合計を計算します。

工学計算と科学計算は、これらの比較的小さな丸め誤差が許容される領域です。ユーザーは通常、すべての数値の精度に制限があることを認識しており、多くの場合有効桁数で機能します。しかし、最も重要なことは、それらが明確に定義された相対的精度を持っていることです。

* floatsが値を表すために使用されていた金融アプリケーションにかつて取り組んだことがあり、その結果、丸め誤差が発生しました。幸い、この特定のバグはそれほど重大ではなく、ユーザーはプログラムの計算エラーについて不満を述べていました。そして、これは別のはるかに悪い影響をもたらしました:ユーザーはシステムへの信頼を失い始めました。

0
Pete