Python で最も一般的に使用されるデータ型の 1 つは 、浮動小数点数を表す float です。浮動小数点数は、小数点以下の桁を持つ正または負の数値です。浮動小数点数には、科学表記法を使用して表現された数値も含まれます。文字 e または E は 、10 の累乗を示すために使用されます。
Float は、非常に小さな数値から非常に大きな数値まで、幅広い実数を表すことができるため、非常に重要なデータ型です。
Python の浮動小数点数の例を以下に示します。
# float numbers
a = 20.0
b = -51.51345
c = 65e7
d = -1.08E12
e = 2E10
print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))
出力:
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
さらに、数値の小数部分を削除する整数などのデータ型と比較して、より正確な計算が可能になります。たとえば、整数の場合、3.142 などの数値は単純に 3 として表されます。
ただし、float データ型は実際の数値 (3.142) をそのまま表します。したがって、浮動小数点値はより正確な結果が得られるため、数学的計算に適しています。
この点において、浮動小数点値は、実世界のモデリング、機械学習、データ サイエンス、金融および経済分析、数学的計算、グラフィックスと視覚化、および科学技術計算で広く使用されています。
Python における整数と浮動小数点数
整数も Python で非常によく使われるデータ型です。浮動小数点数とは異なり、整数には小数点がありません。整数は、正の整数、負の数、ゼロで構成され、それらには小数部がありません。
整数は、カウントやインデックス付けなど、整数を含む操作を実行する場合に便利です。 Python では、整数値は int として表されます。
いくつかの整数を以下に示します。
a = 0
b = 968
c = -14
print(type(a))
print(type(b))
print(type(c))
出力:
<class 'int'>
<class 'int'>
<class 'int'>
Python における整数と浮動小数点数の違いには、次のようなものがあります。
特性 | 整数 | 浮く |
---|---|---|
代表する | 整数、それに対応する負の数、ゼロ。すべて小数点はありません。 | 小数点付きの実数 |
精度 | 精度が無制限であるため、int 値の長さや大きさに制限はありません。唯一の制約は、システムで使用可能なメモリです。 | 精度に限界がある。保存できる最大の float 値は約 1.8 x 10 308 です。 |
メモリ使用量 | フローティングメモリの使用量が少なくなる | 整数値よりも多くのメモリを使用する |
ビット単位の演算 | ビット単位の演算で広く使用されます | ビット単位の演算ではほとんど使用されません |
使用法 | 通常、カウント、インデックス付け、ビット単位の演算で使用されます。 | 測定、科学計算、およびほとんどの数学的演算に広く使用されています。 |
Python でフロートを作成および使用するさまざまな方法
Python で float 値の操作を開始する簡単な方法は、次のように変数に float 値を割り当てることです。
# assign a variable a float value
a = 3.142
float 値を取得するもう 1 つの方法は、 float() コンストラクターを使用して整数と数値文字列を float 値に変換することです。整数または数値文字列を float() に渡すと、以下に示すように float 値に変換されます。
number1 = 2524
numString1 = "513.523"
numString2 = "1341"
# Convert to a float and store the float value in a variable
a = float(number1)
print(a)
b = float(numString1);
print(b)
c = float(numString2)
print(c)
出力:
2524.0
513.523
1341.0
上の例では、整数と文字列は float() を使用して float 値に変換され、変数に格納されてから出力され、変換後の結果の float 値が表示されます。
float 値を取得するもう 1 つの方法は、以下に示すように、除算などの数学的計算を実行することです。
num1 = 20
num2 = 3
result = num1/num2
print("Result of the division as an integer:")
print(int(20/3))
print("Result of the division as a float value:")
print(result)
print(type(result))
出力:
Result of the division as an integer:
6
Result of the division as a float value:
6.666666666666667
<class 'float'>
上の例では、除算して結果を整数として返す場合と比較して、float 値の方がより正確な答えが得られることに注目してください。
Python で浮動小数点数を扱う場合、コンピューター内部で浮動小数点値がどのように表現されるかが原因で、非常に興味深い結果が得られることがあります。浮動小数点数は、コンピューター ハードウェアでは基数 2 (2 進数) の分数として表されます。
ただし、ほとんどの小数部、特に反復小数部を含む小数部は、正確な 2 進数の分数として表すことができません。その結果、浮動小数点数は通常、実際の値の近似値として保存されます。
これを実際に確認するには、float 値 0.3 を考えてみましょう。変数に 0.3 を代入しても、内部的には正確に 0.3 として保存されません。これを確認するには、 format() 関数を使用して、0.3 が内部でどのように表現されるかを確認します。 format() を 使用すると、操作している値の有効数字を任意の数で表示できます。以下の例では、内部でどのように保存されるかを確認するために、0.3 ~ 20 の有効数字を出力しています。
num = 0.3
print("num to 20 significant figures")
print(format(num, '.20f'))
print("Value we stored for num")
print(num)
出力:
num to 20 significant figures
0.29999999999999998890
Value we stored for num
0.3
ご覧のとおり、num という変数に割り当てた値 0.3 は、内部的には正確に 0.3 として保存されません。変数 num を出力すると、丸められた値が得られます。
このため、float 値を操作するときに予期しない結果が生じる可能性があります。たとえば、0.3 + 0.3 + 0.3 を手動で計算すると、答えは 0.9 になります。ただし、Python によれば、内部的には実際の値の 2 進分数近似値が保存されるため、そうではありません。これは以下で確認できます。
sum = 0.3 + 0.3 + 0.3
answer = 0.9
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)
出力:
Is sum equal to answer:
False
The internal representation of of sum is:
0.8999999999999999
The answer from manual calculation is:
0.9
したがって、float 値を扱うときは、Python が内部的に正確な値を保存しないことに留意することが重要です。代わりに、実際の値の近似値が保存されます。
したがって、浮動小数点値を比較するときは、最初に同じ有効数字に四捨五入することをお勧めします。 Python で浮動小数点数を操作する際の精度を高めるには、組み込みの 10 進数 モジュールの使用を検討してください。
Python の Decimal モジュール
金融計算や科学計算など、高精度が重要かつ必須の状況では、float の使用は理想的ではありません。浮動小数点数を扱う際に高い精度を保証するために、組み込みの Python モジュール 10 進数 が使用されます。
マシンに依存するバイナリ浮動小数点表現として保存される float とは異なり、10 進数モジュールは、より高い精度を提供するマシンに依存しない 10 進数ベースの表現を使用して浮動小数点数を保存します。
さらに、10 進数モジュールは、10 進数をそのまま表現し、計算にそのまま使用できます。また、正しく丸められた 10 進浮動小数点演算も提供します。
10 進数モジュールの使用を開始するには、次のように Python ファイルにインポートします。
import decimal
10 進 モジュールの利点を確認するために、0.3 + 0.3 + 0.3 の合計と値 0.9 の間の以前の比較をやり直してみましょう。これを行うコードを以下に示します。
import decimal
sum = decimal.Decimal('0.3') + decimal.Decimal('0.3') + decimal.Decimal('0.3')
answer = decimal.Decimal('0.9')
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)
出力:
Is sum equal to answer:
True
The internal representation of sum is:
0.9
The answer from manual calculation is:
0.9
したがって、浮動小数点数を操作し、高い精度が必要な場合は、常に 10 進数 モジュールを使用することを忘れないでください。
フロートを使用する場合の一般的なエラー
Python で Float を使用するときに発生するエラーの多くは、浮動小数点数が Python の内部でどのように表現されるかを理解していないことに起因します。たとえば、0.3 などの値は、正確に 0.3 として保存されるわけではありません。したがって、浮動小数点値がそのまま保存されていると仮定して、浮動小数点値を操作すると、エラーが発生する可能性があります。
よくあるエラーの 1 つは、float 値に対して数学的計算を実行するときに発生する丸め誤差です。 Python は実際の float 値を表すことができないため、結果が期待どおりにならない場合に丸めエラーが発生する可能性があります。
四捨五入誤差などのエラーのため、浮動小数点値間の等価比較を行おうとするとエラーが発生する可能性があります。 Python で float を扱うときは十分に注意し、予期しない結果に注意してください。
float 値を扱うときに発生する可能性のあるすべてのエラーを回避するより良い方法は、組み込みの 10 進数 モジュールを使用することです。こうすることで、浮動小数点数の計算結果がより予測可能かつ正確になります。
結論
Python を扱うプログラマは、必ず float データ型を使用することになります。このデータ型でのエラーを回避するには、Python が内部で浮動小数点数をどのように表現するかを理解することが重要です。 Python は実際の浮動小数点数値を保存できないため、浮動小数点値との正確な等価比較は避けてください。そうしないと、エラーが発生します。
アプリケーションで正確な結果が必要な場合は、float 値の使用を避けてください。代わりに、組み込みの 10 進数 モジュールを使用してください。このモジュールは、正確な浮動小数点数の結果を生成し、それらをマシンに依存しない方法で正確に表現します。
「Python Itertools 関数」と「Python Try Except」もお読みください。