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

回答編集履歴

3

2018/10/11 07:13

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -3,22 +3,20 @@
3
3
 
4
4
  ```
5
5
  import math
6
+ import sys
6
7
 
7
8
  def log(x):
8
9
  if x <= 0:
9
10
  print('domain error', x)
10
- return
11
-
12
- y = math.log(x)
13
- if y == float('inf'):
11
+ elif x == float('inf'):
14
- print('inf: log({})={}'.format(x, y))
12
+ print('inf', x)
15
13
  else:
16
14
  print('valid: log({})={}'.format(x, y))
17
15
 
18
- log(1.e1000) # inf: log(inf)=inf
16
+ log(1.e1000) # float に収まらないので inf になる。
19
17
  log(1.e-10) # valid: log(1e-10)=-23.025850929940457
20
18
  log(1.e-100) # valid: log(1e-100)=-230.25850929940458
21
- log(1.e-1000) # domain error 0.0 このケースは x > 0 だが、0の次に大きい浮動小数点数より小さい数なので、
19
+ log(1.e-350) # domain error 0.0 このケースは x > 0 だが、0の次に大きい浮動小数点数より小さい数なので、
22
20
  # 最近接丸めにより0になる。
23
21
  log(0) # domain error 0
24
22
  log(-1) # domain error -1

2

a

2018/10/11 07:13

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -22,4 +22,12 @@
22
22
  # 最近接丸めにより0になる。
23
23
  log(0) # domain error 0
24
24
  log(-1) # domain error -1
25
- ```
25
+ ```
26
+
27
+ ## log(x) の返り値について
28
+
29
+ * x <= 0: domain error
30
+ * log(inf) = inf
31
+ * log(x) = inf となる場合はありえない。
32
+ log(x) = inf となるのは、log(x) > float_max より、x > exp(float_max) の場合だが、exp(float_max) > float_max なので、x が float で表せるのに log(x) が inf になることはない。
33
+ * x > 0 でも 0 の次に大きい浮動小数点数より小さい数 (例: 1.0e-1000) は、最近接丸めにより 0 に丸められるので、x <= 0 で domain error となる。

1

2018/10/11 07:05

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,9 +1,25 @@
1
- 対数関数 log(x) x > 0 の実数定義されます。
1
+ x <= 0 でドメインエラーはカバーされているように思います。
2
- で、以下のようにしてあげるとよいかと思います。
2
+ 1.e-1000 のような x > 0 だが、0の次大きい浮動小数点数り小さ数は、最近接丸めにより 0 に丸められるので、domain error になります。
3
3
 
4
4
  ```
5
+ import math
6
+
7
+ def log(x):
5
- if x <= 0:
8
+ if x <= 0:
6
- print('domain error')
9
+ print('domain error', x)
10
+ return
11
+
12
+ y = math.log(x)
13
+ if y == float('inf'):
14
+ print('inf: log({})={}'.format(x, y))
7
- else:
15
+ else:
16
+ print('valid: log({})={}'.format(x, y))
17
+
18
+ log(1.e1000) # inf: log(inf)=inf
19
+ log(1.e-10) # valid: log(1e-10)=-23.025850929940457
20
+ log(1.e-100) # valid: log(1e-100)=-230.25850929940458
21
+ log(1.e-1000) # domain error 0.0 このケースは x > 0 だが、0の次に大きい浮動小数点数より小さい数なので、
22
+ # 最近接丸めにより0になる。
8
- log(x) # 計算する。
23
+ log(0) # domain error 0
24
+ log(-1) # domain error -1
9
25
  ```