4

こんにちは、Python で辞書を使用して、いくつかの都市とその人口を次のように保存しています。

population = { 'Shanghai' : 17.8, 'Istanbul' : 13.3, 'Karachi' : 13.0, 'mumbai' : 12.5 }

コマンドを使用すると、次print populationの結果が得られます。

{'Karachi': 13.0, 'Shanghai': 17.800000000000001, 'Istanbul': 13.300000000000001, 'mumbai': 12.5}

一方、コマンドを使用するprint population['Shanghai']と、の初期入力が得られます17.8

あなたへの私の質問は、どのようにして17.8と がそれぞれ と になっ13.3たのですか? そのすべての情報はどのように生成されましたか? 少なくとも私が知る限り、最初の入力はその追加情報を必要としないことを示しているため、なぜそこに保存されているのですか。17.80000000000000113.300000000000001

4

3 に答える 3

6

これは Python 3.1 で変更されました。新着情報ページから:

Python は現在、David Gay のアルゴリズムを使用して、値を変更しない最短の浮動小数点表現を見つけます。これにより、2 進浮動小数点数に関する混乱がいくらか軽減されます。

1.1重要性は、2 進浮動小数点に正確に相当するものがないような数値で簡単にわかります。正確に対応するものはないため、 like のような式は、16 進数または10 進数float('1.1')の最も近い表現可能な値に評価されます。その最も近い値は、その後の浮動小数点計算で使用されていました。0x1.199999999999ap+01.100000000000000088817841970012523233890533447265625

新しいのは、数値の表示方法です。以前は、Python は単純なアプローチを使用していました。の値は、に評価さrepr(1.1)れるとして計算されました。17 桁を使用する利点は、IEEE-754 の保証に依存して、元の値に正確に往復することを保証することでした。欠点は、多くの人が出力がわかりにくいことです (2 進浮動小数点表現の固有の制限を Python 自体の問題と誤解しています)。format(1.1, '.17g')'1.1000000000000001'eval(repr(1.1))

の新しいアルゴリズムrepr(1.1)はよりスマートで、 を返します'1.1'。事実上、すべての同等の文字列表現 (同じ基になる float 値で格納されるもの) を検索し、最短の表現を返します。

新しいアルゴリズムは、可能な場合はよりクリーンな表現を出力する傾向がありますが、基になる値は変更しません。1.1 + 2.2 != 3.3したがって、表現が別のことを示唆しているとしても、それは依然として事実です。

新しいアルゴリズムは、基になる浮動小数点実装の特定の機能に依存します。必要な機能が見つからない場合は、古いアルゴリズムが引き続き使用されます。また、テキスト ピクル プロトコルは、古いアルゴリズムを使用することでクロスプラットフォームの移植性を保証します。

(Eric Smith と Mark Dickinson による寄稿; issue 1580 )

于 2012-06-28T10:04:45.747 に答える
2

浮動小数点数がコンピューターでどのように機能するかをよく読む必要があります。

基本的に、すべての 10 進数を正確に格納できるわけではありません。そのような場合は、可能な限り近い数値を取得します。この抽象化が漏れて、エラーが表示されることがあります。

これはおそらく、説明した 2 つのユースケースで使用される印刷ロジックの違いによるものです。動作を再現できませんでした (Win64 で Python 2.7.2 を使用)。

のように正確に表現可能な数値を使用する1.5と、効果がなくなると思います。

于 2012-06-28T09:53:29.433 に答える
1

世界中のどのマシンでも指定したとおりに小数を正確に表現したい場合は、 decimal.Decimal を使用する必要があります。

詳細については、Python マニュアルを参照してください: http://docs.python.org/library/decimal.html

>>> from decimal import Decimal
>>> print Decimal('3.14')
3.14
于 2012-06-28T10:01:57.167 に答える