回答編集履歴

3

2018/10/11 07:13

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -8,6 +8,8 @@
8
8
 
9
9
  import math
10
10
 
11
+ import sys
12
+
11
13
 
12
14
 
13
15
  def log(x):
@@ -16,15 +18,9 @@
16
18
 
17
19
  print('domain error', x)
18
20
 
19
- return
21
+ elif x == float('inf'):
20
22
 
21
-
22
-
23
- y = math.log(x)
24
-
25
- if y == float('inf'):
23
+ print('inf', x)
26
-
27
- print('inf: log({})={}'.format(x, y))
28
24
 
29
25
  else:
30
26
 
@@ -32,13 +28,13 @@
32
28
 
33
29
 
34
30
 
35
- log(1.e1000) # inf: log(inf)=inf
31
+ log(1.e1000) # float に収まらないので inf になる。
36
32
 
37
33
  log(1.e-10) # valid: log(1e-10)=-23.025850929940457
38
34
 
39
35
  log(1.e-100) # valid: log(1e-100)=-230.25850929940458
40
36
 
41
- log(1.e-1000) # domain error 0.0 このケースは x > 0 だが、0の次に大きい浮動小数点数より小さい数なので、
37
+ log(1.e-350) # domain error 0.0 このケースは x > 0 だが、0の次に大きい浮動小数点数より小さい数なので、
42
38
 
43
39
  # 最近接丸めにより0になる。
44
40
 

2

a

2018/10/11 07:13

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -47,3 +47,19 @@
47
47
  log(-1) # domain error -1
48
48
 
49
49
  ```
50
+
51
+
52
+
53
+ ## log(x) の返り値について
54
+
55
+
56
+
57
+ * x <= 0: domain error
58
+
59
+ * log(inf) = inf
60
+
61
+ * log(x) = inf となる場合はありえない。
62
+
63
+ log(x) = inf となるのは、log(x) > float_max より、x > exp(float_max) の場合だが、exp(float_max) > float_max なので、x が float で表せるのに log(x) が inf になることはない。
64
+
65
+ * x > 0 でも 0 の次に大きい浮動小数点数より小さい数 (例: 1.0e-1000) は、最近接丸めにより 0 に丸められるので、x <= 0 で domain error となる。

1

2018/10/11 07:05

投稿

tiitoi
tiitoi

スコア21956

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