Функция регистрации вручную не найдет журналы с базовыми 10 за 10 - PullRequest
1 голос
/ 13 мая 2019

В качестве задания я кодирую функцию журнала, используя метод hi-lo, чтобы найти ответ, но то, что у меня есть, не работает для чисел больше 10, и я не могу понять, почему

int main() {
  double n, nq, x, y;
  printf("Enter the number you wish to take to the base 10 logarithm:\n");
  scanf("%lf", &x);
  double hi = 1;
  double lo = 0;
  double qlo = 1;
  double qhi = 10;

  for(int i = 0; i <= 1000; i++) {
    n = ((lo + hi)/2);
    nq = sqrt(qlo * qhi);
    if(nq > x) {
      hi = n;
      qhi = nq;
    } else {
      lo = n;
      qlo = nq;
    }
  }
  y = n;

  printf("the logarithm is equal to %lf\n", y);
  printf("%lf\n", log10(x)); // to check result
}

Ответы [ 3 ]

3 голосов
/ 13 мая 2019

Установив qhi на 10, вы ограничили свой результат до 10. Установка hi на 1 также не помогает. Таким образом, любой вход больше 10 вернет значение 1.

Вам нужно быть более разумным при выборе вариантов hi, lo, qlo и qhi, если вы хотите, чтобы ваша функция работала с большим доменом.

2 голосов
/ 13 мая 2019

Это близко к математической проблеме. Ваша функция может вычислить приближение log 10 (x) для любого значения x в диапазоне [1:10] . Обоснование простое: log 10 (1) равно 0, log 10 (10) равно 1 и log 10 (sqrt (a * b)) равно 1/2 (log 10 (a) + log 10 (b)).

Таким образом, вы строите 2 последовательности, первая из которых использует дихотомию для аппроксимации x, вторая - для логарифма 10 (x).

Просто вы должны соблюдать следующее ограничение: 1 <= x <= 10. </p>

Обычным способом является запись x = m 10 n с 1 <= m <10. Просто разделите (соответственно умножьте) x на десять, пока он не попадет в правильный диапазон, если он> = 10 (соответственно <= 1). Тогда вы получите тривиально: log <sub>10 (x) = n + log 10 (m). И даже не пытайтесь отрицательное значение ...

1 голос
/ 13 мая 2019
Enter the number you wish to take to the base 10 logarithm:
1234.5678
50 iterations found 3.091514945509

См. Изменения ниже ...

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <math.h>

int main()
{
  double x, y;
  printf("Enter the number you wish to take to the base 10 logarithm:\n");
  scanf("%lf", &x);
  double hi = 1;
  double lo = 0;
  double qlo = 1;
  double qhi = 10;

  /*if (x <= 0) handle exception log undefined for input <= 0*/

  double tmp = 0;
  while (x > 10)
  {
    tmp++;
    x /= 10;
  }

  int i;
  double n = 0, nprev = -1;
  for (i = 0; i <= 1000 && fabs(n - nprev) > 1.0E-15; i++) 
  {
        nprev = n;
    n = ((lo + hi) / 2);
    double nq = sqrt(qlo * qhi);
    if (nq > x) 
    {
      hi = n;
      qhi = nq;
    }
    else 
    {
      lo = n;
      qlo = nq;
    }
  }
  y = tmp + n;
  printf("%2d iterations found %.12f",i,y);
}
...