科学/工学で浮動小数点数が頻繁に使用されるのはなぜですか?


33

浮動小数点数の精度を調査しているときに、いくつかの場所で次のようなステートメントを確認しました。

floatとdoubleは設計 / 使用頻度が高い工学および科学計算

私の理解では、floatとdoubleの強さは、それらが(良いが完全ではない)精度のために使用するメモリの量です。

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

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

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

誰かがこの説明を拡張して、おそらく例を挙げることができますか?



47
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.科学と工学の両方で、特定のポイントまでの精度のみを重視します。すべての計算に無限の精度を使用すると、多くの場合、不必要に費用がかかります。浮動小数点を固定小数点と区別するのは、特定の小数点以下の桁数を確定する必要がないことです。小数点以下の桁数が非常に少ない場合や、精度が制限されている場合は非常に多くなります。
ドーバル14年

24
上記のポイントに追加すると、特定のポイントを超える精度を気にしないだけでなく、入力の多くが測定値であり、固有の誤差があるため、正確な結果を得ることができません

2
また、丸め誤差が累積し続けることも当然のことではないことを指摘しています。それはあなたが何をしているか、どのようにそれをやっているかに依存します。それ専用のフィールド全体があります。
ドーバル14年

10
浮動小数点は「ランダムな精度」ではなく、さまざまな操作のエラーは予測可能であり、よく知られており、アルゴリズムのエラーは解決できます。それらが十分に低い場合(特に、後方エラーが入力変数の不確実性よりも小さい場合)、結果が良好であること(または、少なくともそれらの問題が浮動小数点によって引き起こされていないことを確認できます)ポイントエラー)。
ホッブズ14年

回答:


77

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

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

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


2
いい答えだ。基礎となる関数は完全に連続している場合があり、正確にモデル化するには完全な精度が必要ですが、現実には科学と工学のすべてが近似です。私たちはむしろ、まともで有用な近似を持ち、無限の精度よりも何かを達成したいと考えています。そのため、多くの操作が完了するまで永遠に待ちます。
ジョナサンユニス14年

4
@JonathanEunice現実を正確にモデル化することはできません。モデルへの入力は測定から得られ、おそらく現代のコンピューター/ソフトウェアのネイティブの実数がその時点でそれを制限するほど正確には測定できないでしょう。言い換えれば、完璧なモデル、ソフトウェア、または数学を持つことができますが、それは問題ではありません。例えば、箱の体積を計算します。a*b*c簡単なことですが、絶対に確実に行うことはできない次元を測定する必要があります。したがって、とにかく計算の無限の精度は必要ありません。測定誤差に縛られるだけです。
luk32 14年

2
@ luk32私たちはそれらのポイントのほとんどについて激しく同意します。あるもの(球体の体積など)を正確にモデル化できますが、正確に測定することはできません。そして、現実は完璧なモデルに完全には適合しません。完璧な測定値や計算を待つよりも、わずかに不正確で有用な値/モデルを取得する方が良いでしょう。これは常に一歩先を行くものです。
ジョナサンユニス14年

2
「問題の核心は、ほとんどの科学的および工学的計算には高速で巨大な範囲が必要であるということです」長い時間をかけても、正確に計算するアルゴリズムは広く知られていないため、正確に計算できません。そして何よりも、数字を正確に表現することさえできません。これは、解決方法がわからないだけの問題であり、迅速でも低速でもありません。
マイケルルバルビエグリューネ

@MichaelGrünewald、実数を正確に表すことはできませんが、数千フィートの高さの構造を構築し、DNA内の遺伝子を特定し、2年後に彗星と衛星をランデブできるほど十分に近い問題を解決することができます宇宙で。ランディ・ニューマンを言い換えると、それは正確ではないかもしれませんが、大丈夫です。実際、任意の精度のライブラリを使用して、正確に論理式を表現できます(メモリの制限があります)。
チャールズE.グラント14年

30

どのような代替案を提案しますか?

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

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

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

  • また、任意精度の小数を使用することもできますが、無限に繰り返される数字を取得するため、除算のような単純なものでも機能しません。また、合理的な数値に似たパフォーマンスを実行すると複雑さが増すという問題に直面する可能性がありますが、程度は低くなります。

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


1
最良の答えの1つである、私は私のものを書く前にそれを見落としました。
マイケルルバルビエグリューネ

8
さらに、2つの計算可能な実数が等しいかどうかさえわからないという少し不便な事実があります。
ヨルグWミットタグ14年

1
すべての計算可能な実数を使用すると、比較で問題が発生しませんか?停止する問題を解決せずに、任意の計算可能な実数を比較することはできません。
カスペルド14年

@kasperd:計算で使用できる操作にある程度依存すると思いますが、計算タイプのセットがどれだけ豊富かはわかりませんが、任意の2つの結果が有限数の操作で生成されたものは、制限時間内に比較できます。代数型はほぼ確実にその基準を満たしますが、ln(x)関数とexp(x)関数を追加してもそれが満たされるかどうかはわかりません。
supercat 14年

任意の精度の演算(加算、乗算、減算、除算)、無理数(√2など)、よく知られている超越関数(Piやeなど)、トリガー関数などを連続分数を使用してサポートできます。HAKMEMのGosperのアルゴリズムを参照してください。終了したら、遅延評価を実行して、希望する精度の浮動小数点近似を取得できます。
ポールチェルノック

14

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

ここで理解する必要がある重要な用語は、 有効数字です。数字の有効数字は、その精度に貢献する意味を持つ数字です。

これは基本的に、何かが12センチの長さだと言ったら、実際には長さ11,5センチから12.5センチの間にあることを意味します。ただし、長さが12,00センチであると述べた場合、長さは11,995センチから12,005センチになります。

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


@leftaroundabout数学(数学のように)は科学ではないということですか?私の本ではそうです。
ピーターB 14年

2
@PieterB:数学は科学ではありません。それは哲学です。科学は、私たちの物理的な世界の理解を形成する行為です。哲学は、理想の世界でアイデアがどのように機能するかを理解する行為です。
スリーブマン14年

科学は通常、有意な数字よりも明示的な信頼範囲での作業を好むと思います。
Taemyr

@slebetmanそれに加えて、私の投稿の私のポイントとは何の関係もありませんが、数学が科学かどうかは引用を落とすのを助けることができません。自然は本質的に数学であり、彼女は数学で私たちに話します。耳を傾けるだけです。自然は数学的であるため、自然を説明しようとする科学はすべて数学に完全に依存しています。この点を強調しすぎることは不可能であり、それがカール・フリードリヒ・ガウスが数学を「科学の女王」と呼んだ理由です。
ピーターB 14年

その引用はここからです。よく読んで議論することがたくさんありますが、実際にはあなたの投稿やこの質問とは何の関係もないので、ここでは説明しません。
左辺り

7

注浮動小数点数は、基本的に同じであることを科学工学の表記法、数学と科学の書き込み番号への人間のための標準的な方法。これらの分野では、極端な精度はそれほど必要ではありませんが、しばしば大きな範囲があります。

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

科学と工学のコンピューティングにも同様の推論が適用されます:範囲は広いですが、非常に大きな数値を保存して処理する必要はないため、正規化された値と指数を保存します。


6

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

ゴールドバーグの論文は、おそらく浮動小数点数の特性の最も有名な分析です(そして、この種のことを気にするなら読む必要があります)が、カハンの論文は、微妙な多くの背後にある理論的根拠を説明するのにより良い仕事をしていると思いますデザインの問題。

特に、カハンの浮動小数点のJavaの実装についての非難は、かなりの炎症ながら、IEEE-754意味が有用であり、その理由について、いくつかの良いポイントになり何も符号ビットについての多くの騒ぎはかなりの深さでの署名ゼロの理論的根拠を探るを。


私はまだカハンの論文全体を読んでいませんが、彼は私よりも礼儀正しいようです。Javaには、real3つのスタックエントリを保存するタイプを追加し、マシンの自然な計算精度を表すタイプを追加した場合、実際よりも高速で実行可能な数値を使用できます。値は、80ビットフロート+ 64ビットフロート+ 32ビットパディングをパディングする16ビット、または64ビット仮数、16ビット指数、および符号とフラグの[非FPU実装用] 16ビットとして格納できます。
supercat 14年

を指定しfloatdoubleストレージ形式でありreal、計算形式です。FPUのない多くのシステムでは、ワードおよびハーフワード境界にある仮数、指数、およびフラグを操作する方が、すべての操作でダブルをアンパックおよび再パックするよりも高速です。
supercat 14年

2

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

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

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

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

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

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

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

「問題は、有理数は実数を表現するのにそれほど良い選択ではなかったということです」と言うことで反応するかもしれません。それから、Debianのスリーブフォークをロールアップし、実数の新しい表現システムを考案します。

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

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

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


これは素晴らしい質問であり、この質問に対する答えではなく、質問者があなたがしているポイントを理解することになるとは限りません。それと、あなたは有限のデジタル表現による\ Realまたは\ Complex数の不正確な表現(動的または静的なビット幅に関係なく)に非常に満足しています。それはすべて完全に真実ですが、ポイントの横にあります。ロボット的に金山を引用しないことに対する称賛。:)そして、Baireの定理は、ProgrammersやStackOverflowで見られる通常のレトリックの一部ではありません。
mctylr 14年

0

なぜなら

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

2)物理量は連続的であり、まさに「浮動小数点数により連続量をモデル化できる」と述べているとおりです。

..そして、私の答えの残りはRufflewindによってうまくまとめられているので、ここでそれを繰り返すつもりはありません。


0

浮動小数点数は、相対的な精度を提供します。これらは、さまざまな数の正確な数からせいぜい小さなパーセンテージ(パーセンテージで0.0000000000001%のようなものを呼び出したい場合)を表すことができます。彼らはこの特性をスライドルールと共有していますが、スライドルールは3桁の精度のようなものより良くなることはありません。それでも、デジタルコンピューターが一般的になる前に、大きな構造物の静的および動的な力を計算するには十分でした。これは、材料定数にもある程度のばらつきがあり、材料や構造の違いに適度に優しい構造を選ぶ傾向があるためです最大負荷と弱点を合理的に識別できるようにします。

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

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

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

また、CやFortranなどのプログラミング言語は、精度の乗算と除算の混合や加算/減算用のキャリービットなどの基本演算にアクセスするのを驚くほど難しくします。これらは、制限された精度の整数を超える基本的な構成要素です。

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


0

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

特定の桁数で正確に数字を表現できるようにする必要がある場合、浮動小数点数は不適切です。現実の世界。

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

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

エンジニアリングおよび科学計算は、これらの比較的小さな丸め誤差が許容される領域です。ユーザーは通常、すべての数値の精度が制限されていることを認識しており、多くの有効数字で作業することがよくあります。しかし、最も重要なのは、それらが明確に定義された相対精度を持っていることです。つまり、非常に大きな数と非常に小さな数の両方で、同じ数の有効数字を提供します。

*私はかつてfloatsが値を表すために使用されていた金融アプリケーションで働いていたため、丸め誤差が導入されました。幸いなことに、この特定のバグはまったく重大なものではなく、ユーザーはプログラムの計算エラーについて不平を言っていました。そして、これは別のはるかに悪い影響をもたらしました:ユーザーはシステムに対する信頼を失い始めました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.