回答編集履歴

1

d

2019/04/17 05:59

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -111,3 +111,73 @@
111
111
 
112
112
 
113
113
  ![イメージ説明](3bce370765db02f68dca663a5032743c.png)
114
+
115
+
116
+
117
+ ## 追記
118
+
119
+
120
+
121
+ 元のコードの `ya == yb` が以下の点で問題
122
+
123
+
124
+
125
+ 1. 0.000001 ずつ +x 方向に移動して f(x) の値を確認するというやり方なので、完全に0になる点が見つかるとは限らない。
126
+
127
+ 2. 浮動小数点数同士の演算では、丸め誤差が発生するので、等号を使った比較は意図した通りには動かない。十分近いかどうかで判断する必要がある。
128
+
129
+
130
+
131
+ [浮動小数点数の誤差を考慮した比較【double/float型の正しい比較方法】 | MaryCore](https://marycore.jp/prog/c-lang/compare-floating-point-number/)
132
+
133
+
134
+
135
+ ```c
136
+
137
+ #include <math.h>
138
+
139
+ #include <stdio.h>
140
+
141
+
142
+
143
+ #define EPS 0.00001
144
+
145
+ #define ITERATIONS 1000000000
146
+
147
+
148
+
149
+ int main()
150
+
151
+ {
152
+
153
+ double x = 0;
154
+
155
+ for (int i = 0; i < ITERATIONS; ++i) {
156
+
157
+ double y = sin(x) + x - 1;
158
+
159
+
160
+
161
+ if (fabs(y) < EPS) {
162
+
163
+ printf("solution: f(%f) = %f\n", x, y);
164
+
165
+ // solution: f(0.510969) = -0.000008
166
+
167
+ break;
168
+
169
+ }
170
+
171
+
172
+
173
+ x += 0.000001; // 移動
174
+
175
+ }
176
+
177
+ return 0;
178
+
179
+ }
180
+
181
+
182
+
183
+ ```