私は、入力されたリストとそのリストの平均との間の距離であるリストを返そうとするかなり簡単な関数を持っています。コードはほぼです。なぜ結果がややずれているのかについての考えはありますか? [-4.200000000000003、35.8、2.799999999999997、-23.200000000000003、-11.200000000000003]は[4.2、-35.8、-2.8、23.2、11.2]等しくなければならない私のリスト構造の数学演算は数十億分の一になりますか?
3
A
答えて
7
これが原因である :ここ
def distances_from_average(test_list):
average = [sum(test_list)/float(len(test_list))]*len(test_list)
return [x-y for x,y in zip(test_list, average)]
は私の例の結果でありますコンピュータが浮動小数点数を表現する方法まで。
は、彼らはいつもあなたが期待する方法で、正確ではありませんので、平等を確認するか、お金の量のようなものを表すために使用すべきではありません。
はどのようにこれらの番号が使用されていますか?そのような精度が必要な場合は、情報を使用するより良い方法があります。たとえば、等価性のチェックではなく範囲のチェックなどがあります。あなたは完全にバイナリとなることが丸め誤差にどのように表現されるか浮動小数点考慮しない場合
2
浮動小数点は、驚くべき結果につながることができます。浮動小数点の丸め誤差は、直列和で悪化します。
例:
>>> sum([.1]*10)
0.9999999999999999 # 1.0 expected in decimal
>>> sum([.1]*1000)
99.9999999999986 # 100.0 expected
>>> sum([1, 1e100, 1, -1e100] * 10000)
0.0 # 20000 expected
、丸め誤差が加算時解除によって除去することができる他の技術の中で正確な結果(画分モジュールを使用して、小数点モジュールを使用して、等)を取得するための多数の方法があります。あなたは合計で、より正確な結果を得るためのPython数学ライブラリからfsumを使用することができます。
>>> import math
>>> math.fsum([.1]*10)
1.0
>>> math.fsum([.1]*1000)
100.0
>>> math.fsum([1, 1e100, 1, -1e100] * 10000)
20000.0
fsum
機能がレイモンドヘッティンガーのActive Stateレシピに基づいています。 (try math.fsum([1.1,2.2]*1000)
...)ではありませんが、かなり良いです。
+0
私は 'math.fsum'について知りませんでした。とても面白いです。 +1 –
関連する問題
- 1. 数十億の整数を格納するデータ構造
- 2. 構造体演算子関数のオーバーロード
- 3. Cassandraの数学演算
- 4. のBigDecimal数学演算
- 5. は数学演算子
- 6. 値と数学演算のリストの数式を見つける(またはブルートフォース)
- 7. カリー化数学演算子は、Scalaの
- 8. データベース設計 - 数十億のレコードが1つのテーブルにありますか?
- 9. シェルスクリプト - 数学演算とループ
- 10. .NET数学計算公演
- 11. 数学演算のアルゴリズムのアルゴリズム
- 12. 可変数の引数に対するJava数学演算
- 13. 単純な数学演算Python
- 14. コンパイラ前処理中の数学演算
- 15. jQueryの実行数学演算
- 16. php float数学演算のバグ?
- 17. Python 2.7出力上の数学演算
- 18. PHPとMySQLの数学演算
- 19. 手書きの数学演算子データベース
- 20. データベース設計 - 数十億レコードのシステムに従います
- 21. C++関数演算子の構造体は何もしていませんか?
- 22. Cleo(linkedinのオートコンプリート解)は数十億の要素に適していますか?
- 23. osdevの学習に十分な小さなカーネルはありますか?
- 24. さまざまなデータ型で数学演算が異なるのですか?
- 25. NCalcでは、数学演算で{} []を使用できますか?
- 26. C#の論理演算子の構造
- 27. ポインタ演算:構造体
- 28. オーバーロード構造体演算子
- 29. Stackdriverのロギングメトリックフィールドで数学演算を実行するには?
- 30. Bindingパスに数学演算子を適用できますか?
のみ53ビット浮動小数点精度のために使用されているため: - ://docs.python https://docs.python.org/2/tutorial/floatingpoint.htmlは[ 'decimal'](HTTPSを見て.org/2/library/decimal.html)モジュール。 – Jan
有限精度の浮動小数点演算の世界へようこそ。 – karakfa
使用することを検討してください[FSUM](https://docs.python.org/2/library/math.html#math.fsum)リンクの重複が主にJavaScriptのであり、この特定のPythonに適用できる解決策を持っていなかったので、私は再び開か – dawg