回答編集履歴

11

修正

2017/12/12 05:21

投稿

.M.
.M.

スコア98

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ```C
40
40
 
41
- if (x < -0.0 || 0.0 < x)
41
+ if (x < -1e-10 || 1e-10 < x)
42
42
 
43
43
  ```
44
44
 
@@ -46,11 +46,19 @@
46
46
 
47
47
  ```C
48
48
 
49
+ if (1e-10 < fabs(x))
50
+
51
+ ```
52
+
53
+ などとします。なぜ
54
+
55
+ ```C
56
+
49
57
  if (0.0 < fabs(x))
50
58
 
51
59
  ```
52
60
 
53
- とします。ちみに。C言語(gccg++)は、実数ゼロ、+0.0と-0.0の二が存在します。どちらもほぼ同じです(+0.0==-0.0は真判定されます)、区別されて計算され関数もあります。
61
+ としないのかは同じ理由誤差ため理論的計算結果では0.0でもC言語を使っている1e-10よりも小さく、か0.0より大きい、いう答えになる可能性ためです。
54
62
 
55
63
 
56
64
 
@@ -60,7 +68,7 @@
60
68
 
61
69
  ```C
62
70
 
63
- if(0.0 < x)
71
+ if(1e-10 < x)
64
72
 
65
73
  ```
66
74
 
@@ -78,7 +86,7 @@
78
86
 
79
87
  ```C
80
88
 
81
- if((0.0 < fabs(a) || (0.0 < (fabs(b))
89
+ if((1e-10 < fabs(a) || (1e-10 < (fabs(b))
82
90
 
83
91
  ```
84
92
 
@@ -86,7 +94,7 @@
86
94
 
87
95
  ```C
88
96
 
89
- if(0.0 < (fabs(a)+(fabs(b))
97
+ if(1e-10 < (fabs(a)+(fabs(b))
90
98
 
91
99
  ```
92
100
 

10

修正

2017/12/12 05:21

投稿

.M.
.M.

スコア98

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ```C
40
40
 
41
- if (x < 0.0 || 0.0 < x)
41
+ if (x < -0.0 || 0.0 < x)
42
42
 
43
43
  ```
44
44
 
@@ -50,7 +50,7 @@
50
50
 
51
51
  ```
52
52
 
53
- とします。
53
+ とします。ちなみに。C言語(gcc、g++)では、実数のゼロに、+0.0と-0.0の二つが存在します。どちらもほぼ同じです(+0.0==-0.0は真と判定されます)が、区別されて計算される関数もあります。
54
54
 
55
55
 
56
56
 

9

修正

2017/12/12 04:22

投稿

.M.
.M.

スコア98

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ```C
40
40
 
41
- if (x < -0.0 || 0.0 < x)
41
+ if (x < 0.0 || 0.0 < x)
42
42
 
43
43
  ```
44
44
 
@@ -50,7 +50,7 @@
50
50
 
51
51
  ```
52
52
 
53
- とします。ちなみに、0(実数のゼロ)には二種類(+0.0と-0.0)がありC言語内では異なる数値として判定されます。
53
+ とします。
54
54
 
55
55
 
56
56
 

8

実数の0.0について補足説明追加

2017/12/12 04:17

投稿

.M.
.M.

スコア98

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ```C
40
40
 
41
- if (x < 0.0 || 0.0 < x)
41
+ if (x < -0.0 || 0.0 < x)
42
42
 
43
43
  ```
44
44
 
@@ -50,7 +50,7 @@
50
50
 
51
51
  ```
52
52
 
53
- とします。
53
+ とします。ちなみに、0(実数のゼロ)には二種類(+0.0と-0.0)がありC言語内では異なる数値として判定されます。
54
54
 
55
55
 
56
56
 

7

修正

2017/12/12 04:11

投稿

.M.
.M.

スコア98

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 数値判定時は、特に、整数(int)か実数(浮動小数点数、float, double)かに注意してください。特に実数の時は==で判定することは推奨されていません。実数を厳密に比較するのは誤差が絡むため難しいからです。0.0かどうかも同様です。ですので、実数変数xが0かどうかを判定する場合は通常
5
+ 数値判定時は、特に、整数(int)か実数(浮動小数点数、float, double)かに注意してください。特に実数の時は==もしくは!=で判定することは推奨されていません。実数を厳密に比較するのは誤差が絡むため難しいからです。0.0かどうかも同様です。ですので、実数変数xが0かどうかを判定する場合は通常
6
6
 
7
7
 
8
8
 
@@ -38,7 +38,15 @@
38
38
 
39
39
  ```C
40
40
 
41
- if (x < 0.0 && 0.0 < x)
41
+ if (x < 0.0 || 0.0 < x)
42
+
43
+ ```
44
+
45
+ あるいは
46
+
47
+ ```C
48
+
49
+ if (0.0 < fabs(x))
42
50
 
43
51
  ```
44
52
 

6

修正

2017/12/12 04:01

投稿

.M.
.M.

スコア98

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  ```
84
84
 
85
- としても数学的には同じになりますが、aとbが非常に大きな数と非常に小さい数であった場合、情報落ちの誤差が生じる可能性があります
85
+ としても数学的には同じになります。
86
86
 
87
87
 
88
88
 

5

修正

2017/12/12 03:58

投稿

.M.
.M.

スコア98

test CHANGED
@@ -78,11 +78,11 @@
78
78
 
79
79
  ```C
80
80
 
81
- if(0.0 < (fabs(a)*(fabs(b))
81
+ if(0.0 < (fabs(a)+(fabs(b))
82
82
 
83
83
  ```
84
84
 
85
- としても数学的には同じになりますが、数字が非常に大きい場合はオーバーフロー(float, double制限を超えてしまう)のエラー起きる可能性があります。
85
+ としても数学的には同じになりますが、aとbが非常に大きな数と非常に小さ数であった場合、情報落ち誤差生じる可能性があります。
86
86
 
87
87
 
88
88
 

4

修正

2017/12/12 03:56

投稿

.M.
.M.

スコア98

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 数値判定時は、特に、整数(int)か実数(浮動小数点数、float, double)かに注意してください。特に実数の時は==で判定することは推奨されていません。実数を厳密に比較するのは誤差が絡むため難しいからです。0.0かどうかも同様です。ですので、実数変数xが0でないかどうかを判定する場合は通常
5
+ 数値判定時は、特に、整数(int)か実数(浮動小数点数、float, double)かに注意してください。特に実数の時は==で判定することは推奨されていません。実数を厳密に比較するのは誤差が絡むため難しいからです。0.0かどうかも同様です。ですので、実数変数xが0かどうかを判定する場合は通常
6
6
 
7
7
 
8
8
 
@@ -60,7 +60,7 @@
60
60
 
61
61
 
62
62
 
63
-
63
+ り、まとめますと、
64
64
 
65
65
  > aが0でないまたはbが0でない場合(実数の場合)
66
66
 
@@ -70,12 +70,20 @@
70
70
 
71
71
  ```C
72
72
 
73
- if((0.0 < fabs(a) && (0.0 < (fabs(b))
73
+ if((0.0 < fabs(a) || (0.0 < (fabs(b))
74
74
 
75
75
  ```
76
76
 
77
77
  となります。
78
78
 
79
+ ```C
80
+
81
+ if(0.0 < (fabs(a)*(fabs(b))
82
+
83
+ ```
84
+
85
+ としても数学的には同じになりますが、数字が非常に大きい場合はオーバーフロー(float, doubleの制限を超えてしまう)のエラーが起きる可能性があります。
86
+
79
87
 
80
88
 
81
89
  ご参考までに。

3

修正

2017/12/12 03:52

投稿

.M.
.M.

スコア98

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 数値判定時は、特に、整数(int)か実数(浮動小数点数、float, double)かに注意してください。特に実数の時は==で判定することは推奨されていません。実数を厳密に比較するのは誤差が絡むため難しいからです。0.0かどうかも同様です。ですので、実数変数xが0かどうかを判定する場合は通常
5
+ 数値判定時は、特に、整数(int)か実数(浮動小数点数、float, double)かに注意してください。特に実数の時は==で判定することは推奨されていません。実数を厳密に比較するのは誤差が絡むため難しいからです。0.0かどうかも同様です。ですので、実数変数xが0でないかどうかを判定する場合は通常
6
6
 
7
7
 
8
8
 
@@ -34,7 +34,15 @@
34
34
 
35
35
 
36
36
 
37
- などとします。この1e-10というのは1x10のマイナス10乗(=0.0000000001)という意味です。
37
+ などとします。この1e-10というのは1x10のマイナス10乗(=0.0000000001)という意味です。逆に0でないかどうかを判定するには
38
+
39
+ ```C
40
+
41
+ if (x < 0.0 && 0.0 < x)
42
+
43
+ ```
44
+
45
+ とします。
38
46
 
39
47
 
40
48
 
@@ -44,17 +52,17 @@
44
52
 
45
53
  ```C
46
54
 
47
- if(x > 0.0)
55
+ if(0.0 < x)
48
56
 
49
57
  ```
50
58
 
51
- でも構いません。
59
+ だけでも構いません。
52
60
 
53
61
 
54
62
 
55
63
  また
56
64
 
57
- > aが0でないまたはbが0でない場合
65
+ > aが0でないまたはbが0でない場合(実数の場合)
58
66
 
59
67
 
60
68
 
@@ -62,27 +70,11 @@
62
70
 
63
71
  ```C
64
72
 
65
- if((fabs(a) < 1e-10) || ((fabs(b) < 1e-10)))
73
+ if((0.0 < fabs(a) && (0.0 < (fabs(b))
66
74
 
67
75
  ```
68
76
 
69
- とするよりも
70
-
71
- ```C
72
-
73
- if(fabs(a*b) < 1e-10)
74
-
75
- ```
76
-
77
- とする方がシンプルになります(数学的に同じ意味になります、ただし大きな数の場合にはオーバーフロー(a*bの結果がfloat、doubleの制限を超えてしまうエラー)が起きる可能性はあります)。a,b共に正の実数だという条件があらかじめ判明しているならば
78
-
79
- ```C
80
-
81
- if((a+b) > 0.0)
82
-
83
- ```
84
-
85
- でも同じ意味になります。
77
+ なります。
86
78
 
87
79
 
88
80
 

2

修正

2017/12/12 03:48

投稿

.M.
.M.

スコア98

test CHANGED
@@ -8,9 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- ```
11
+ ```C
12
-
13
- C
14
12
 
15
13
  if (-0.001 < x && x < 0.001)
16
14
 

1

修正

2017/12/12 03:40

投稿

.M.
.M.

スコア98

test CHANGED
@@ -46,12 +46,6 @@
46
46
 
47
47
  ```C
48
48
 
49
- #include <math.h>
50
-
51
- ...
52
-
53
-
54
-
55
49
  if(x > 0.0)
56
50
 
57
51
  ```