回答編集履歴

2

<cmath> 追加

2020/04/12 07:54

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -23,6 +23,8 @@
23
23
  ```C++
24
24
 
25
25
  #include <iostream>
26
+
27
+ #include <cmath> // fabs
26
28
 
27
29
  using namespace std;
28
30
 

1

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

2020/04/12 07:54

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -3,3 +3,71 @@
3
3
  x1 = x2; x2 = x3; にしないと、
4
4
 
5
5
  x1 と x2 が同じ値になって、ゼロ除算を実行してしまいますよ。
6
+
7
+
8
+
9
+ **追記**
10
+
11
+ 速くする方法ですか。
12
+
13
+ ・pow を使わない。
14
+
15
+ ・同じ値 x で何度も f(x) を計算するのをやめる。
16
+
17
+ ・内部で float から double への変換があって、double のほうが速いかも。
18
+
19
+ ・int と double を混ぜると、int から double への変換が余計に入る。
20
+
21
+
22
+
23
+ ```C++
24
+
25
+ #include <iostream>
26
+
27
+ using namespace std;
28
+
29
+
30
+
31
+ double a, b, c, d, e;
32
+
33
+
34
+
35
+ double f(double x) { //f(x) = x^5 + ax^4 + bx^3 + cx^2 + dx + e
36
+
37
+ return ((((x + a)*x + b)*x + c)*x + d)*x + e;
38
+
39
+ }
40
+
41
+
42
+
43
+ int main()
44
+
45
+ {
46
+
47
+ double x1, x2, x3;
48
+
49
+ char p;
50
+
51
+ cin >> a >> p >> b >> p >> c >> p >> d >> p >> e >> x1 >> p >> x2;
52
+
53
+ double f1 = f(x1), f2 = f(x2);
54
+
55
+ while (1) {
56
+
57
+ double xp = f2 * (x2 - x1) / (f2 - f1);
58
+
59
+ x3 = x2 - xp;
60
+
61
+ if (fabs(xp) < 1e-6) break;
62
+
63
+ x1 = x2, x2 = x3, f1 = f2, f2 = f(x3);
64
+
65
+ }
66
+
67
+ printf("%.3f", x3);
68
+
69
+ return 0;
70
+
71
+ }
72
+
73
+ ```