回答編集履歴
1
d
answer
CHANGED
@@ -54,4 +54,39 @@
|
|
54
54
|
solution: x=0.510973
|
55
55
|
```
|
56
56
|
|
57
|
-

|
57
|
+

|
58
|
+
|
59
|
+
## 追記
|
60
|
+
|
61
|
+
元のコードの `ya == yb` が以下の点で問題
|
62
|
+
|
63
|
+
1. 0.000001 ずつ +x 方向に移動して f(x) の値を確認するというやり方なので、完全に0になる点が見つかるとは限らない。
|
64
|
+
2. 浮動小数点数同士の演算では、丸め誤差が発生するので、等号を使った比較は意図した通りには動かない。十分近いかどうかで判断する必要がある。
|
65
|
+
|
66
|
+
[浮動小数点数の誤差を考慮した比較【double/float型の正しい比較方法】 | MaryCore](https://marycore.jp/prog/c-lang/compare-floating-point-number/)
|
67
|
+
|
68
|
+
```c
|
69
|
+
#include <math.h>
|
70
|
+
#include <stdio.h>
|
71
|
+
|
72
|
+
#define EPS 0.00001
|
73
|
+
#define ITERATIONS 1000000000
|
74
|
+
|
75
|
+
int main()
|
76
|
+
{
|
77
|
+
double x = 0;
|
78
|
+
for (int i = 0; i < ITERATIONS; ++i) {
|
79
|
+
double y = sin(x) + x - 1;
|
80
|
+
|
81
|
+
if (fabs(y) < EPS) {
|
82
|
+
printf("solution: f(%f) = %f\n", x, y);
|
83
|
+
// solution: f(0.510969) = -0.000008
|
84
|
+
break;
|
85
|
+
}
|
86
|
+
|
87
|
+
x += 0.000001; // 移動
|
88
|
+
}
|
89
|
+
return 0;
|
90
|
+
}
|
91
|
+
|
92
|
+
```
|