回答編集履歴

2

1行無駄なコードがあったので削除

2024/07/11 18:02

投稿

退会済みユーザー
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誤差の最大値なのでこれを使用する)

2024/07/11 17:54

投稿

退会済みユーザー
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
- if (is_acceptable_error(abserr, relerr)) return L;
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() {