今回はpythonのfloat型についてみてゆきます。
float 倍精度浮動小数
python3のfloatは倍精度浮動小数です。floatを用いた計算の利点としてはDecimalなどとは異なりハードウェアの機能を用いてリソースを効率的に用いて高速に計算できることです。欠点は丸め誤差、打ち切り誤差、桁落ち、情報落ちが発生することです。
発生する誤差 | 説明 |
---|---|
丸め誤差 | 有効桁を超えた際に有効桁数を打ち切ることで発生する誤差(円周率が正確に表せないなど)。 |
打ち切り誤差 | 計算結果を途中で打ち切ることで発生する誤差(2進数で1/10の計算途中で打ち切るなど)。 |
桁落ち | 値がほぼ等しい値同士の差を求める場合に有効数字が減ることにより発生する誤差(1.0000000-1.0000001=1×10^(-1)となり実質的な有効桁数が8桁から1桁に減る)。 |
情報落ち | 大きい数と小さい数の加減算時に小さい数が無視されることによる誤差(例えば有効桁数8桁の場合でx=1.0000000 のときx=x+1.0000000×10^(-8)を繰り返してもxの値が変わらない) |
文字列からfloatへの変換
文字列からfloatに変換するにはfloat関数を用います。
もしfloat型に変換できない場合にはValueErrorが発生します。
f1=float('-0.1ABC')
実行結果
ValueError: could not convert string to float: '-0.1ABC'
指数表記
floatに変換する文字列は大きい数や小さい数をfloatに変換するために指数表記を用いることができます。
大きい数を扱う場合
# 指数表記 1.0E+5(1.0×10の5乗)
f1=float('1.0E+5')
print(f1)
実行結果
100000.0
floatの最大値を超えた場合
floatの最大値は実行環境によっても異なりますが、大部分の環境では1.7976931348623157E+308です。これを超えた値がどうなるか確認します。
f1=float('1.0E+309')
print(f1)
実行結果
inf
最大値を超えた場合infとなるようです。
0に近い数を扱う場合
# 指数表記 1.0E-2(1.0×10の-2乗)
f1=float('1.0E-2')
print(f1)
実行結果
0.01
floatの分解能より0に近い数を扱う場合
floatの分解能より0に近い数を扱う場合どうなるかみてみます。
f1=float('1.0E-324')
print(f1)
実行結果
0.0
予想どおりですが0と表示されます。私の環境では'1.0E-323'までは1e-323と表示されました。そのため私の環境ではpythonのfloatの分解能は1.0E-323と1.0E-324の間にあるとおもわれます。
Decimalからfloatへの変換
同様にfloat関数で変換します。誤差が発生する場合でも警告は出さず丸められて変換されます。
from decimal import Decimal
d1=Decimal('0.1')
f1=float(d1)
print(f1)
実行結果
0.1
complex(複素数)からfloatへの変換
以下のように虚部を0にしてもエラーが発生します。
c2=complex(1,0)
f2=float(c2)
print(f2)
エラー内容
TypeError: can't convert complex to float
complex型に変換したいときには虚部と実部をチェックの上、実部のみをとりだすなど工夫をする必要があります。 実部はcomlex型のrealプロパティに入っています。虚部はimagプロパティに入っています。
c2=complex(1,0)
if c2.imag == 0.0:
f2=float(c2.real)
else:
f2=None
print(f2)
実行結果
1.0
まとめ
今回はpythonのfloatについて調べてみました。基本的なことでも、疑問にもって調べてみると色々とわかって面白いですね。
Comment on this article
コメントはまだありません。
Send comments