手工编码的日志功能将无法找到10以上的10级日志

时间:2019-05-13 07:25:38

标签: c math logarithm

作为一项作业,我正在使用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 个答案:

答案 0 :(得分:3)

在将qhi设置为10时,您将结果限制为10。将hi设置为1也无济于事。因此,任何大于10的输入都将返回值1。

如果您想让函数在更大的域中工作,则在选择hiloqloqhi时,您需要更加明智。 / p>

答案 1 :(得分:2)

这接近一个数学问题。您的函数能够为[1:10] 范围内的任何值x计算log 10 (x)的近似值。背后的原理很简单:log 10 (1)为0,log 10 (10)为1,log 10 (sqrt(a * b))是1/2(log 10 (a)+ log 10 (b))。

因此,您构建了2个序列,第一个序列使用二分法近​​似x,第二个序列将近似log 10 (x)。

您必须遵守以下约束:1 <= x <= 10。

常见的方法是将x = m 10 n 写入1 <= m <10。如果x> = 10(resp <= 1),只需将x除以10(直到乘以10),直到它落在正确的范围内。然后,您会发现:log 10 (x)= n + log 10 (m)。而且甚至不要尝试使用负值...

答案 2 :(得分:1)

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);
}