回答編集履歴
2
1行無駄なコードがあったので削除
test
CHANGED
@@ -25,7 +25,6 @@
|
|
25
25
|
double binsearch(int N, int& count) {
|
26
26
|
count = 1;
|
27
27
|
double L = 0, R = N;
|
28
|
-
double abserr, relerr;
|
29
28
|
while (R - L > 0.001 && (L>0 ? (R-L)/L : 1) > 0.001) {
|
30
29
|
double M = (L + R) / 2;
|
31
30
|
double fm = f(M);
|
1
f(x)の誤差を求めていたが、xの誤差だったので修正(R-Lがx誤差の最大値なのでこれを使用する)
test
CHANGED
@@ -22,33 +22,19 @@
|
|
22
22
|
return x * x * x + x;
|
23
23
|
}
|
24
24
|
|
25
|
-
void error(double value, double expected, double& abserr, double& relerr) {
|
26
|
-
auto result = value - expected;
|
27
|
-
abserr = result >= 0 ? result : -result;
|
28
|
-
relerr = abserr / expected;
|
29
|
-
}
|
30
|
-
|
31
|
-
bool is_acceptable_error(double abserr, double relerr) {
|
32
|
-
return abserr <= 0.001 || relerr <= 0.001;
|
33
|
-
}
|
34
|
-
|
35
25
|
double binsearch(int N, int& count) {
|
36
26
|
count = 1;
|
37
27
|
double L = 0, R = N;
|
38
28
|
double abserr, relerr;
|
39
|
-
error(f(L), N, abserr, relerr);
|
40
|
-
i
|
29
|
+
while (R - L > 0.001 && (L>0 ? (R-L)/L : 1) > 0.001) {
|
41
|
-
error(f(R), N, abserr, relerr);
|
42
|
-
if (is_acceptable_error(abserr, relerr)) return R;
|
43
|
-
while (true) {
|
44
30
|
double M = (L + R) / 2;
|
45
31
|
double fm = f(M);
|
46
|
-
error(fm, N, abserr, relerr);
|
47
|
-
if (is_acceptable_error(abserr, relerr)) return M;
|
48
32
|
if (fm >= N) R = M;
|
49
33
|
else L = M;
|
50
34
|
++count;
|
51
35
|
}
|
36
|
+
if (N - f(L) < f(R) - N) return L;
|
37
|
+
else return R;
|
52
38
|
}
|
53
39
|
|
54
40
|
int main() {
|