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

回答編集履歴

1

d

2019/04/17 05:59

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -54,4 +54,39 @@
54
54
  solution: x=0.510973
55
55
  ```
56
56
 
57
- ![イメージ説明](3bce370765db02f68dca663a5032743c.png)
57
+ ![イメージ説明](3bce370765db02f68dca663a5032743c.png)
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
+ ```