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

回答編集履歴

2

<cmath> 追加

2020/04/12 07:54

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -11,6 +11,7 @@
11
11
 
12
12
  ```C++
13
13
  #include <iostream>
14
+ #include <cmath> // fabs
14
15
  using namespace std;
15
16
 
16
17
  double a, b, c, d, e;

1

高速化のアドバイスを追加

2020/04/12 07:54

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -1,3 +1,37 @@
1
1
  x2 = x3; x1 = x2; を
2
2
  x1 = x2; x2 = x3; にしないと、
3
- x1 と x2 が同じ値になって、ゼロ除算を実行してしまいますよ。
3
+ x1 と x2 が同じ値になって、ゼロ除算を実行してしまいますよ。
4
+
5
+ **追記**
6
+ 速くする方法ですか。
7
+ ・pow を使わない。
8
+ ・同じ値 x で何度も f(x) を計算するのをやめる。
9
+ ・内部で float から double への変換があって、double のほうが速いかも。
10
+ ・int と double を混ぜると、int から double への変換が余計に入る。
11
+
12
+ ```C++
13
+ #include <iostream>
14
+ using namespace std;
15
+
16
+ double a, b, c, d, e;
17
+
18
+ double f(double x) { //f(x) = x^5 + ax^4 + bx^3 + cx^2 + dx + e
19
+ return ((((x + a)*x + b)*x + c)*x + d)*x + e;
20
+ }
21
+
22
+ int main()
23
+ {
24
+ double x1, x2, x3;
25
+ char p;
26
+ cin >> a >> p >> b >> p >> c >> p >> d >> p >> e >> x1 >> p >> x2;
27
+ double f1 = f(x1), f2 = f(x2);
28
+ while (1) {
29
+ double xp = f2 * (x2 - x1) / (f2 - f1);
30
+ x3 = x2 - xp;
31
+ if (fabs(xp) < 1e-6) break;
32
+ x1 = x2, x2 = x3, f1 = f2, f2 = f(x3);
33
+ }
34
+ printf("%.3f", x3);
35
+ return 0;
36
+ }
37
+ ```