5

私はPythonの学習を始めたばかりで、特殊性に出くわしました

パイソンのバージョン:

Python 2.7.2 (デフォルト、2011 年 7 月 20 日、02:32:18) [GCC 4.2.1 (LLVM、Emscripten 1.5、Empythoned)] on linux2

上: http://repl.it/languages/Python

インタープリター割り当ての操作:

    pi = 3.141 // 3 places decimal precision
    #typing pi  & pressing return puts 3.141
   type(pi)
=> <type 'float'>
    pi = 3.1415
   type(pi)
=> <type 'float'>
    #pi puts 3.1415000000000002

浮動小数点の精度は不正確であることで有名です。 しかし、なぜ4ポイントの精度だけがその「テール」を取得するのですか?

また:

 pi2 = 3.1415100000000002
 pi == pi2 # pi was assigned 3.1415
 => True
 print(pi2)
 3.14151 # Where's my precision? 
4

1 に答える 1

4

整数と浮動小数点数には特定のビット数が与えられます。整数の場合、各ビットは 2 のべき乗に対応します。最初の桁は 2 0で、次に 2 1、2 2などです。5したがって、整数を格納するには、 2 0 + 2 2 = 1 + 4があります。

浮動小数点数の場合、2 つの部分に分けて格納します。指数と小数。小数が .75 で指数が 2 の場合、.75 * 10 2 = 7.5となります。小数は 2 の負の累乗として格納されます。したがって、2 -1、2 -2があります。2 -3。など。これらは 、 、 などに相当.5.25ます.125

一部の数値は、0.1 のように表現するのに文字通り無限のビットが必要なため、格納できません。また、3.1415 のような他の数値は、CPU が浮動小数点数に提供するよりも多くのビットを必要とします (24 は 32 ビット浮動小数点数の標準ですが、アルゴリズムは異なります)。

フロートを比較する正しい方法は、分散を定義し、これらの線に沿って何かを使用することです。

variance = .0001
floatsEqual = lambda f1, f2: f1 - variance <= f2 and f1 + variance >= f2

if (floatsEqual(3.1415, 3.1415 + 1 - 1)):
    pass

Python では、decimal ライブラリも便利です。

于 2013-07-17T10:23:35.307 に答える