浮動小数点の精度を顧客に説明する[非公開]


23

浮動小数点の丸めの問題を顧客に説明する最良の方法は何ですか?

知っている

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

開発者や科学者向けのC ++ FAQやその他のさまざまなページのエントリだけでなく、数学や科学の背景が限られている「通常の」顧客向けのWebページ、記事、説明はありますか。(上記の参照はフラットになります)。

それが維持されていたり、有名でよく知られている機関や企業から来たものであれば、あなたが経験したかもしれないことを考えると、自分自身を説明するのは少し複雑かもしれません。


1
私は...気にしないだろう
ジョン・シャフト

1
これは本当に素晴らしい質問です。できれば+10です。開発者にとって頻繁に起こる問題。
コーディグレー

2
それは詳細の問題ではなく、10進数の2桁の精度の数値を追加する理由を答えています。6ではなく5.9999999になります。 tには2桁以上の10進数があります。または、なぜ2マイナス2が常にゼロではないのか、そうするときに竹馬鹿のように見えないのはなぜですか。
エリックグランジ

9
@Eric Grange:顧客がこれらの精度の問題をバグと見なす場合、それバグであり、それを修正する方法を見つける必要があります(おそらくfloatを使用しないことによって)。彼らは、この精度の問題がどこから来たかは気にしません。彼らはあなたのソフトウェアがどのように動作するかを気にしません。彼らはただそれが機能することを望んでいます。
デビッド

3
@Eric:浮動小数点の使用は、ある実装の詳細。私は質問を繰り返しますが、質問で説明されていないことを要求し、明らかにされていないことを明らかにします(謝罪):コンテキストは何ですか、なぜ顧客と浮動小数点の使用について議論していますか?
トムアンダーソン

回答:


8

これを説明する簡単な方法は、それを実証することです。x数値で除算し、同じ数値を乗算するとx再び元に戻る方法について話し合います 。これが常に当てはまることを顧客に同意してもらいます。次に(100 / 3) * 3、電卓で古い操作を行います。ほとんどの人が明らかに単純な数学を「分解」するのを見ると、精度が重要な浮動小数点数の危険性を「取得」する傾向があります(ただし、直感的には方法、あなたが指す記事が低レベルにではなく)。

残念ながら、ほとんどの半分の計算機(確かに私が見たすべての科学計算機、およびいくつかの基本的な計算機)は現在これを処理できます-表示および丸めることができるものを超える余分な数字を格納していると思います-そうする顧客の前で電卓を行う前に、電卓がどれほど賢いかを確認してください。


1
はい、ほとんどすべての計算機には少なくとも2桁の余分な数字が格納されているので、ミックスに複数の乗算を追加する必要があります。これは説明を混乱させ、IMEはそれらを欺こうとしていると考えさせます。平方根はより少ない操作で済みますが、平方根はすでに一般顧客の日常の領域から外れています。
エリックグランジ

2
@Scottここでいくつかの電卓を試してみましたが、(100/3)* 3で問題を示したものはなく、(100/3)* 3-100でも問題を示しませんでした。Excelでも問題ありません。
エリックグランジ

9
お金を例にとると、完全に制限された精度があります。1ドルを分割すると、すべての人が33セントを受け取り、丸めで1ペニーが失われることを説明します。誰もがそれに関連することができます。
インカ

4
計算機を気にしないでください。紙の上で1を3で割り、有効数字3桁を保持します。
デビッドソーンリー

5
@omegacentauriは、説明が役立つと思うなら、顧客と頻繁に話さないと思います。
11

5

近道はないと思います。次のいずれかを行う必要があります。

  • 浮動小数点とは何か、どのように動作するかを理解します。

または、それがあまりにも必要な場合、あなたはただする必要があります:

  • コンピューターが正確な数値結果を提供しないことを受け入れます。

無理数の例が役立つかもしれません(浮動小数点の問題は有理数にも当てはまりますが)sqrt(2) ~ 1.414。その後1.414^2 = 1.999396。桁数に関係なく、元の値に戻ることはありません2。わかりました。4桁の正しい数字でも問題ありませんが、この種の「丸め誤差」が累積するとどうなるかを考慮してください。ここが本当の危険です。


2
私は個人的に知っていますが、一部の人々にとっては「浮動小数点」はすでに異質な用語であるため、頭の中で計算できるもの、高価なコンピューターとソフトウェアがうまくいかないことを説明するには数学的または科学的な説明以上のものが必要です;)また、平方根は、常連客の日常の領域の外にあります。
エリックグランジ

5

最初に、彼らが不平を言っているものを決定します。金融取引は、小数点以下の桁数と適切な丸め規則を使用して、正確に行われなければなりません。これは通常、整数の通貨​​単位を維持し、算術が正しく行われることを確認することを意味します。

代わりに、彼らは過度に正確な表示について不平を言っているかもしれません、そして、有効数字出力の数を減らすことはすべての必要かもしれません。

一般的な数値の場合、x * 3が10になるように、常に3桁の10進数xを考え出すことができます。これは基本的な原理を示しています。

残りの2つの問題があります。1つは、特定の数値を10進数で正確に表現できますが、2進数では表現できないことです(たとえば、3.15)。それは非技術者に説明するのは難しいでしょう、そしてあなたの最善の策はそれが現れるのに十分な有効数字を提供しないことによってそれを避けるように試みることです。もう1つは、コンピューターの算術演算が必ずしも正確ではなく、10進数の算術演算が必ずしも正確ではないことを認識するのに十分ではないことを十分に知っている顧客です。私はそれらのいくつかについて議論しましたが、報告するのに役立つものは何もありません。


3

コンピューターの浮動小数点数は2進数を使用するため、1、10、100、10分の1、100分の1の列を持つ数値システムと同様に、コンピューターの浮動小数点数には実際には1、2、4、半分、4分の1、 8桁。顧客がフィート/インチに精通している場合は、通常、測定にベースの2分の1インチを使用する方法を思い出させます。

今、半分、四分の一、八分の一の組み合わせとして10セントを保存してみてください。うまくいきません:

.00011001100110011。。。(無限に繰り返す

これは、標準的な帝国の測定テープを取り、1/10インチを測定しようとするのと同じです。正確に行うことはできません。XとYが整数で、Yが2の累乗であるX / Yとしての1/10の表現はありません。

そのため、4ビットを使用して各10進数字を格納する10進データ型があるため、10進表記に戻ります。トレードオフは、スペースとパフォーマンス(私が読んだことから、約100%のパフォーマンスヒット)です。


1

銀行口座が4.4423425908459032890413 ...ドル(4.44ドルまたは4.45ドルのいずれかで、その間に何もない)を保持できないのと同様に、コンピューターは任意の精度で数字を簡単に保存できないことを伝えます。ストレージの欠陥は計算の欠陥につながります。

(それはわずかに不正行為ですが、問題が何であるかのアイデアを提供する必要があります。)


2
残念ながら、その説明は機能しません。精度の問題は、最初に精度が2桁しかない数値を合計すると発生する可能性があるためです。
エリックグランジ

1
2 桁の10進数。はい、私は同意します、好奇心itive盛な顧客はそれに穴を見つけます。しかし、その後、バイナリ表現の議論でそれらを打つことができます-彼らはそれを求めました
;

まあ、すでに浮動小数点を説明しようとすると、IMEはすぐにあなたがそれらを解こうとしていると考え始めます。:)
エリックグランジ

1
@Eric Mathは難しいです、野球をしましょう:P
quant_dev

1
最も近い1/10 "、または最も近いミリメートルを測定する方が正確かどうかを尋ねます。後者はより正確ですが、0.1"の正確な倍数であるオブジェクトは、1mmでもない限り1mmの正確な倍数ではありません5 "(正確には127mm)の正確な倍数。最も近い0.1"に測定される2つの2.54mmオブジェクトのサイズを追加すると、合計サイズは0.2 "になります。実際のサイズは5.08mmである必要があります
supercat

1

2/3

2を3で割った正確な答えを書き留めるように依頼します。
答えは「永遠に続く」ので、それを指摘することができます。

1/3を使用しても機能しますが、2/3はおそらくより良い例です。丸めにより(たとえば).6666667になりますが、.3333333は切り捨てられるように見えます。


0

計算を行う際、コンピューターは通常、数値の近似値を使用します(1000000.7を使用するのではなく、1000000を使用します)。それに関する問題は、近似値を使用して計算を行うと、近似値が返されることです。通常、それはかなりうまく機能しますが、時には予期しない結果につながることがあります。


ここで何を言っているのか本当に分かりません。「近似を使用する方がはるかに速いため」整数演算は少なくとも同じくらい速いことがあり、それは正確です。場合によっては、代替手段がありません(2の平方根を出力する場合など)。
デビッドソーンリー

マーケティング担当者に、コンピューターが実際に非合理的な数字、または基本的には物事の壮大なスキームの数字を表すことができない理由を説明してみてくださいフーリエ級数がかわいいかもしれません。おおよそは、人々が理解できる言葉です。あなたは、すべての数が等しくないことを知っている人の観点からこれに近づいています。

0

いくつかの計算は、いくつかの法的規則に従って行われます。たとえば、ドイツの課税年収79.245,18ユーロに対して課税される所得税の額を計算する場合、正解は1つだけです。あなたはそれを正しく取得するか、それを間違って取得します。正しく理解できれば、浮動小数点演算の仕組みを説明する必要はありません。間違っている場合は、浮動小数点演算の仕組みを説明する必要はありません。壊れたコードを修正する必要があります。

正しく表示されない結果を表示する場合があります。たとえば、US $ 13,297.46を2桁の10進数でUK£に変換してから、その金額のUK£をUS $に戻すと、US $ 13,297.46ではなくUS $ 13,297.45またはUS $ 13,297.47を取得する場合があります。これは、浮動小数点演算とは関係ありません。それは避けられない問題であり、それが避けられない理由をよりよく説明することができます。(また、UK£からUS $に変換したり戻したりしても問題が発生しない理由を知っておく必要があります)

正しく見えない他の可能な結果があります。数値をパーセンテージに変換すると、パーセンテージは100%になりますが、そうではない場合があります。小数点以下2桁で4つのパーセンテージを表示する場合、表示される4つのパーセンテージは合計で99.99%または100.01%になる可能性があります。浮動小数点演算とは関係ありません。それでも、その理由を説明できるはずです。

次に、浮動小数点演算の不注意な使用が不適切な結果をもたらす状況があります。たとえば、a + b + cは通常、b + c + aと同じではありません。それが問題を引き起こす場合、説明するものは何もない、それはあなたが修正するものです。

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