teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

微妙に間違っていたので修正: 少数→小数ほか

2020/06/15 23:21

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -5,9 +5,9 @@
5
5
  # 結果
6
6
  # b=1.00000000000000000
7
7
  ```
8
- bの真の値は1+1E-16ですが1E-16の部分がなくなっています。これはコンピュータの数の表し方が浮動小数点という方式を採用しているためです(現在ほとんどのコンピュータやプログラミング言語で採用されている方式はIEEE-754という浮動小数点方式になります)。
8
+ bの真の値は1+1E-16ですが1E-16の部分がなくなっています。これはコンピュータの数の表し方が浮動小数点という方式を採用しているためです(現在ほとんどのコンピュータやプログラミング言語で採用されている方式はIEEE-754という浮動小数点方式になります)。
9
9
 
10
- pythonでfloatは64bitsの倍精度になります(倍というのは単精度が32bitsですのでその倍という意味です)。簡単にいうと少数部の(bの例だと1)と最下位桁(bの例だと1E-16)は2進数で52桁までしか表現できない方式です。整数部も合わせると53桁になりlog10(2**53)はおよそ16弱になりますので10進数だと最上位の桁と最下位の桁は15桁までということになります。bは1.0と1E-16が16桁離れているので表現できずに誤差になるという訳です。
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を追加

2020/06/15 23:21

投稿

yymmt
yymmt

スコア1615

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

精度保証を任意精度に改めました

2020/06/15 17:07

投稿

yymmt
yymmt

スコア1615

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  # 以下同じ
19
19
  ```
20
20
 
21
- 他にも精度保証ライブラリMPFRを用いた`gmpy2`パッケージや、なるべく二次元方程式に値を代入せずに変数のまま方程式として解く`simpy`があります。これらは用途に応じて使い分けることになります。
21
+ 他にも任意精度の浮動小数点ライブラリMPFRを用いた`gmpy2`パッケージや、なるべく二次元方程式に値を代入せずに変数のまま方程式として解く`simpy`があります。これらは用途に応じて使い分けることになります。
22
22
 
23
23
  参考URL
24
24
  - [ウィキペディア IEEE 754](https://ja.wikipedia.org/wiki/IEEE_754)