回答編集履歴
3
微妙に間違っていたので修正: 少数→小数ほか
answer
CHANGED
@@ -5,9 +5,9 @@
|
|
5
5
|
# 結果
|
6
6
|
# b=1.00000000000000000
|
7
7
|
```
|
8
|
-
bの真の値は1+1E-16ですが1E-16の部分がなくなっています。これはコンピュータの
|
8
|
+
bの真の値は1+1E-16ですが1E-16の部分がなくなっています。これはコンピュータの小数の表し方が浮動小数点という方式を採用しているためです(現在ほとんどのコンピュータやプログラミング言語で採用されている方式はIEEE-754という浮動小数点方式になります)。
|
9
9
|
|
10
|
-
pythonでfloatは64bitsの倍精度になります(倍というのは単精度が32bitsですのでその倍という意味です)。簡単にいうと
|
10
|
+
pythonでfloatは64bitsの倍精度になります(倍というのは単精度が32bitsですのでその倍という意味です)。簡単にいうと最上位桁の(bの例だと1)と最下位桁(bの例だと1E-16)は2進数で53桁までしか表現できない方式です。log10(2**53)はおよそ16弱になりますので10進数だと最上位の桁と最下位の桁は15桁までということになります。bは1.0と1E-16が16桁離れているので表現できずに誤差になるという訳です。
|
11
11
|
|
12
12
|
改善提案ですが64bitsの倍精度浮動小数点数を単純に128bitsの4倍精度浮動小数点を用いれば良いです。Pythonでは`numpy`という数値計算に必須のパッケージがありますのでこちらを使います。
|
13
13
|
```python
|
2
参考URLを追加
answer
CHANGED
@@ -21,4 +21,5 @@
|
|
21
21
|
他にも任意精度の浮動小数点ライブラリMPFRを用いた`gmpy2`パッケージや、なるべく二次元方程式に値を代入せずに変数のまま方程式として解く`simpy`があります。これらは用途に応じて使い分けることになります。
|
22
22
|
|
23
23
|
参考URL
|
24
|
-
- [ウィキペディア IEEE 754](https://ja.wikipedia.org/wiki/IEEE_754)
|
24
|
+
- [ウィキペディア IEEE 754](https://ja.wikipedia.org/wiki/IEEE_754)
|
25
|
+
- [docs.python.org 15. 浮動小数点演算、その問題と制限](https://docs.python.org/ja/3/tutorial/floatingpoint.html)
|
1
精度保証を任意精度に改めました
answer
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
# 以下同じ
|
19
19
|
```
|
20
20
|
|
21
|
-
他にも精度
|
21
|
+
他にも任意精度の浮動小数点ライブラリMPFRを用いた`gmpy2`パッケージや、なるべく二次元方程式に値を代入せずに変数のまま方程式として解く`simpy`があります。これらは用途に応じて使い分けることになります。
|
22
22
|
|
23
23
|
参考URL
|
24
24
|
- [ウィキペディア IEEE 754](https://ja.wikipedia.org/wiki/IEEE_754)
|