3

私はpythonを計算として使用していましたが、これを見ました

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 62 * 41.2 * 2 / 250
20.435200000000002
>>> 62 * 4.12 * 2 / 25
20.4352
>>>

念のため、gcc を介して次のコードを実行しましたが、上記の動作は表示されませんでした。これは四捨五入を伴う可能性があることは理解していますが、均一にする必要があります。数学的にはそこにあるはずがないのに、python が末尾の 00000000002 を追加するのはなぜですか。

C/C++ コード

#include <stdio.h>
int main () {
  printf ("%lf %lf \n", 62 * 41.2 * 2 / 250, 62 * 4.12 * 2 / 25);
}

結果は

20.435200 20.435200

誰かが特定の数値に興味がある場合、それらはいくつかのエンジン排気量計算の比較に属しています:)

4

5 に答える 5

8

@Ashwini Chaudharyの回答は別として、

質問 :

数学的にはそこにあるはずがないのに、python が末尾の 00000000002 を追加するのはなぜですか

答え :

マシンの値は正確ではないためです。Python のバグでも、コードのバグでもありません。バイナリ浮動小数点演算をサポートするすべての言語で、これとまったく同じ問題が発生します。ただし、言語によって表示が異なる場合があります (四捨五入)。

これを試して:

0.1 + 0.2

あなたは得るでしょう

0.30000000000000004

これは0.1、バイナリ形式で正確に表現できないためです。基数 2、または Binary0.1は、無限の繰り返し数です。

0.0001100110011001100110011001100110011001100110011...

そのため、Python は代わりにこれを四捨五入することにしました。

ここでもっと読むことをお勧めします。

于 2013-04-10T15:45:57.350 に答える
4

心配しないでください。実際には C も同じことを行います。表示される桁数が少なすぎるため、表示されないだけです。

#include <stdio.h>
int main () {
    printf ("%.16lf %.16lf \n", 62 * 41.2 * 2 / 250, 62 * 4.12 * 2 / 25);
}

与える

20.4352000000000018 20.4351999999999983
于 2013-04-10T15:47:53.750 に答える
3

printPythonでも使用します。

In [87]: print 62 * 41.2 * 2 / 250
20.4352

In [88]: print 62 * 41.2 * 2 / 25
204.352

Python シェルはrepr出力を表示するために使用します。そのため、奇妙な出力が得られます。

In [89]: print repr(62 * 41.2 * 2 / 250)
20.435200000000002

print使用するのに対しstr

In [90]: print str(62 * 41.2 * 2 / 250)
20.4352
于 2013-04-10T15:40:53.517 に答える
2

Decimal を使ってみる

>>> from decimal import Decimal
>>> dec = Decimal('41.2')
>>> 62 * dec * 2 / 250
Decimal('20.4352')

パラメータとして文字列を使用する必要があることに注意してください。float をパラメーターとして使用すると、失敗します。

>>> dec1 = Decimal(41.2)
>>> dec2 = Decimal('41.2')
>>> dec1 == dec2
False
>>> print dec1, dec2
41.2000000000000028421709430404007434844970703125 41.2
于 2013-04-10T16:21:16.140 に答える
0

2 進浮動小数点数を扱うという通常の奇妙さにさらされています。これらは、ほとんどのコンピューター言語に共通です。出力の丸め戦略が異なると、これらの問題を隠すことができますが、それでもなお存在します。これらを理解するための通常の参考文献は「What Every Computer Scientist Should Know About Floating-Point Arithmetic」ですが、Python 固有のガイドも「Floating Point Arithmetic: Issues and Limitations」にあります。

Python には、必要に応じてより正確な結果を得るために使用できるソリューションがいくつかあります。1 つ目は、2 進数ではなく 10 進数で動作するdecimalモジュールです。

>>> from decimal import Decimal
>>> Decimal(62) * Decimal("41.2") * Decimal(2) / Decimal(250)
Decimal('20.4352')
>>> Decimal(62) * Decimal("4.12") * Decimal(2) / Decimal(25)
Decimal('20.4352')

別の分子と分母を追跡するfractionsモジュールもあるため、可能な分数を表すことができます。

>>> from fractions import Fraction
>>> Fraction("41.2")
Fraction(206, 5)
>>> Fraction(62) * Fraction("41.2") * Fraction(2) / Fraction(250)
Fraction(12772, 625)
>>> Fraction(62) * Fraction("4.12") * Fraction(2) / Fraction(25)
Fraction(12772, 625)
>>> float(Fraction(12772, 625))
20.4352
于 2013-04-10T16:20:18.837 に答える