2011-09-28 4 views
12

Pythonのdecimal module documentationをよく読んだあと、小数点を分割すると何が起こるのか疑問に思う。 Pythonの2.4.6において小数点を分割すると、Python 2.5から2.7に無効な結果が返される

(理にかなっている):Pythonの2.5.6、Pythonの2.6.7において

>>> import decimal 
>>> decimal.Decimal(1000)/10 
Decimal("100") 

、とPython 2.7.2(不可解):

>>> import decimal 
>>> decimal.Decimal(1000)/10 
Decimal('0.00000-6930898827444486144') 

詳細紛らわしいですまだ、その結果にも有効であると表示されません。

>>> decimal.Decimal('0.00000-6930898827444486144') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 548, in __new__ 
    "Invalid literal for Decimal: %r" % value) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 3844, in _raise_error 
    raise error(explanation) 
decimal.InvalidOperation: Invalid literal for Decimal: '0.00000-6930898827444486144' 

結果はdecimal.Decimal(1000)/decimal.Decimal(10)を使用して同じなので、そうではありません除数としてintを使う問題。問題の

一部は精度の周りに明確である:

>>> decimal.Decimal("1000.000")/decimal.Decimal("10.000") 
Decimal('0.00000-6930898827444486144') 
>>> decimal.Decimal("1000.000")/decimal.Decimal("10") 
Decimal('0.000200376420520689664') 

しかし10により安全に分割し、少なくとも右の球場での答えを得るためにdecimal.Decimal("1000.000")十分精度があるはずです。

この動作がPythonの3つの主要なリビジョンによって変更されていないという事実は、バグではないと私に言います。

私は間違っていますか?私は何が欠けていますか?

10進数(Python 2.4を使用していない)を分割するにはどうすればよいですか?

+0

場合でも、_someone_はおそらくhttp://bugs.python.orgの最後の5年間にいくつかの時点でそれについてのバグレポートを開いている、私はそこ – agf

+0

良い点を見てみましょう。私はそこを捜した。すべての私の検索フーは遠隔に関連して見えているhttp://bugs.python.org/issue7046とhttp://bugs.python.org/issue1031480でしたが、どちらもこれはどちらですか... –

+3

私のためのうまく動作するUbuntu 11.04(Python 2.6.6および2.7.1+)それはmacportsの問題だろうか? – user500198

答えて

7

MacPortsのバグから、Xcode 4がインストールされていて、Python 2.7.2のバージョンはgcc-4.2ではなくclang Cコンパイラでビルドされています。 OS Xに少なくともone known problem with building with clangがあり、2.7.2に続いてPythonで修正されています。リリース。パッチを適用するか、ビルドでgcc-4.2を使用するようにしてください。 (!テストされていない)のようなもの:

sudo bash 
export CC=/usr/bin/gcc-4.2 
port clean python27 
port upgrade --force python27 

前のビルドかもしれない仕事にMacPortsのは、それをオーバーライドしないとき。

UPDATE:必要なパッチは現在、念のためhttps://trac.macports.org/changeset/87442

+0

私はこれが追求する正しい道だと思います。しかし、CC、CXX、CPP =/usr/bin/gcc-4.2をエクスポートしようとしましたが、まだ運がありませんでした。 https://trac.macports.org/wiki/UsingTheRightCompilerは私がボンネットの下で余分な掘削をしている可能性があることを示唆しています。これで作業を続けます... –

+2

私のために働くコンパイラを設定する方法は、 'configure.compiler gcc-4.2'でした - https://trac.macports.org/ticket/31444#commentを参照してください: 8。 –

0

を参照してくださいPythonの2のためにMacPortsのポートファイルに適用されています(OS X上で自作経由で)打ち鳴らすとコンパイルのpython 2.7.3については を、これは修正されているようです。それはバグではありません

Python 2.7.3 (default, Oct 10 2012, 13:00:00) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import decimal 
>>> decimal.Decimal(1000)/10 
Decimal('100') 
関連する問題