はじめに
この実験では、Python である数値が別の数値に近いかどうかをチェックする方法を学び、浮動小数点数の比較に関する問題に対処します。まず、数値の近接性の概念と、コンピュータが浮動小数点数を表現する方法に起因するその重要性を理解します。この表現方法は、浮動小数点数を等しいかどうかで比較する際に予期しない結果をもたらす可能性があります。Python スクリプトでは、0.1 + 0.2 を計算し、その結果を 0.3 と比較することでこの概念を説明し、浮動小数点数の表現による不等性の可能性を示します。
次に、この実験では、近接性を判断する 1 つのアプローチとして、2 つの数値の絶対差を計算する方法を案内します。最後に、相対誤差と絶対誤差の両方を考慮した、より堅牢な浮動小数点数の比較に math.isclose() 関数を使用する方法を学びます。
数値の近接性を理解する
このステップでは、数値の近接性の概念と、プログラミング、特に浮動小数点数を扱う際におけるその重要性を探ります。コンピュータが浮動小数点数を表現する方法のため、これらはしばしば実数の近似値になります。これは、浮動小数点数を等しいかどうかで比較する際に予期しない結果をもたらす可能性があります。
数値の近接性は、2 つの数値が正確に同じでなくても、「十分に近い」と見なせるかどうかを判断するのに役立ちます。これは、浮動小数点数の演算を含む計算を扱う際に特に有用です。
まず、この概念を説明する Python スクリプトを作成しましょう。
LabEx 環境で VS Code エディタを開きます。
~/projectディレクトリにproximity.pyという名前の新しいファイルを作成します。~/project/proximity.pyproximity.pyに以下のコードを追加します。## proximity.py num1 = 0.1 + 0.2 num2 = 0.3 print(f"num1 is: {num1}") print(f"num2 is: {num2}") if num1 == num2: print("num1 and num2 are equal") else: print("num1 and num2 are not equal")このスクリプトは
0.1 + 0.2を計算し、その結果を0.3と比較します。ファイルを保存し、ターミナルで以下のコマンドを使用して実行します。
python ~/project/proximity.py次のような出力が表示されるはずです。
num1 is: 0.30000000000000004 num2 is: 0.3 num1 and num2 are not equalご覧の通り、数学的には等しいはずですが、浮動小数点数の表現のため、
num1とnum2は正確に等しくありません。ここで数値の近接性の概念が重要になります。次のステップでは、この状況を処理する方法を探ります。
絶対差を計算する
このステップでは、2 つの数値の絶対差を計算する方法を学びます。絶対差とは、2 つの数値の順序に関係なく、それらの差の大きさです。言い換えると、2 つの数値の正の差です。
Python の abs() 関数を使用して絶対差を計算することができます。abs() 関数は数値の絶対値を返します。
前のステップの proximity.py スクリプトを修正して、num1 と num2 の絶対差を計算しましょう。
VS Code エディタを使用して、
~/projectディレクトリのproximity.pyファイルを開きます。絶対差を計算するようにコードを修正します。
## proximity.py num1 = 0.1 + 0.2 num2 = 0.3 print(f"num1 is: {num1}") print(f"num2 is: {num2}") absolute_difference = abs(num1 - num2) print(f"The absolute difference between num1 and num2 is: {absolute_difference}") if absolute_difference < 0.00001: ## Using a small tolerance print("num1 and num2 are approximately equal") else: print("num1 and num2 are not approximately equal")このコードでは、
abs()関数を使用してnum1とnum2の絶対差を計算しています。その後、絶対差を小さな許容値(この場合は 0.00001)と比較します。絶対差が許容値より小さい場合、それらの数値をほぼ等しいと見なします。ファイルを保存し、ターミナルで以下のコマンドを使用して実行します。
python ~/project/proximity.py次のような出力が表示されるはずです。
num1 is: 0.30000000000000004 num2 is: 0.3 The absolute difference between num1 and num2 is: 4.440892098500626e-17 num1 and num2 are approximately equalこれで、スクリプトは絶対差と許容値を考慮することで、
num1とnum2がほぼ等しいことを正しく識別しています。このアプローチは、浮動小数点数を直接等しいかどうかで比較するよりも堅牢です。
浮動小数点数に math.isclose() を使用する
このステップでは、浮動小数点数を近似的に等しいかどうか比較するために math.isclose() 関数を使用する方法を学びます。math.isclose() 関数は、固定の許容値を使用するよりも堅牢で推奨される浮動小数点数の比較方法です。
math.isclose() 関数は 2 つの数値を入力として受け取り、指定された許容範囲内で互いに近い場合に True を返し、そうでない場合は False を返します。この関数には 2 つの許容値パラメータがあります。rel_tol(相対許容値)と abs_tol(絶対許容値)です。
前のステップの proximity.py スクリプトを修正して、math.isclose() 関数を使用しましょう。
VS Code エディタを使用して、
~/projectディレクトリのproximity.pyファイルを開きます。math.isclose()を使用するようにコードを修正します。## proximity.py import math num1 = 0.1 + 0.2 num2 = 0.3 print(f"num1 is: {num1}") print(f"num2 is: {num2}") if math.isclose(num1, num2): print("num1 and num2 are approximately equal") else: print("num1 and num2 are not approximately equal")このコードでは、
mathモジュールをインポートし、math.isclose()関数を使用してnum1とnum2を比較しています。rel_tolとabs_tolにはデフォルト値を使用しており、これらはほとんどのケースに適しています。ファイルを保存し、ターミナルで以下のコマンドを使用して実行します。
python ~/project/proximity.py次のような出力が表示されるはずです。
num1 is: 0.30000000000000004 num2 is: 0.3 num1 and num2 are approximately equalこれで、スクリプトは
math.isclose()関数を使用してnum1とnum2が近似的に等しいことを正しく識別しています。これは Python で浮動小数点数を近似的に等しいかどうか比較する際に推奨される方法です。
まとめ
この実験では、まず数値の近接性の概念と、Python で浮動小数点数を比較する際のその重要性を探りました。コンピュータがこれらの数値を表現する方法のため、直接的な等価性の比較は信頼性が低い場合があります。この問題を示すために proximity.py スクリプトを作成し、0.1 + 0.2 と 0.3 を比較しました。その結果、浮動小数点数の表現の問題により、これらは正確には等しくないことが明らかになりました。
その後、この実験では、2 つの数値が「十分に近い」と見なせるかどうかを判断するための代替方法の必要性を紹介し、その後のステップで絶対差の計算などの手法を探る土台を築きました(内容一部省略)。



