标题:【已解决】不调用math库函数求一个数的自然对数
只看楼主
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
结帖率:93.75%
已结贴  问题点数:10 回复次数:18 
【已解决】不调用math库函数求一个数的自然对数
刚发了一帖问求一个数开任意次根,其间写了个用幂级数展开求自然对数,但这个对x是有限制的,ln(1+x)中x是要在 -1到1之间的否则结果不正确,当x较大时怎么解决啊,有什么方法吗?
再说的明白点:  用幂级数展开只能算小数的ln,但是对大数取ln,只能靠查表,那么math库函数里面log是怎么实现的捏
-----------------------------------------------------------------------
我承认我钻牛角尖了,一直在想用级数展开做,其实当我写了第一个mln时我已经完成一大半了,再用下ln函数的性质就可以求出大数的ln,看代码:
程序代码:
#include<stdio.h>
#include<math.h>
#define LN10  (2.302585)

double nci(double k,int r) //求r个k相乘
{
  int i;
  double b=1;
  if (r==0)return 1;
  for (i=1;i<=r;i++) b=b*k;
  return b;
}

double mln(double a)
{
  int i,coo;double x,ans;
  int k=0;
  while (a>1)
    {
        a = a / 10.0;
        k++;
     }
  x=a-1;
  ans=k*LN10;coo=1;
  for (i=1;i<100;i++){
       ans += coo*nci(x,i)/i;coo=coo*(-1);}
  return ans;
}

double jiec(int i)
{
  int j; double ans=1;if (i==0) return 1;
  for (j=2;j<=i;j++)
      ans *=j;
  return ans;
}

double mexp(double ab)
{
  int i;double ans=0;
  for (i=0;i<100;i++)
      ans += nci(ab,i)/(jiec(i)*1.0);
  return ans;
}

main()
{
  double a,b;
  printf("enter a,b : ");
  scanf("%lf %lf",&a,&b);

  printf("手写mln a结果 is %lf\n",mln(a));
  printf("调用math库log a 结果is %lf\n",log(a));

  printf("手写求a的b次的结果answer is %lf\n",mexp(b*mln(a)));
  printf("调用math库求a的b次的结果pow answer is %lf \n",pow(a,b));

  getch();
}


[ 本帖最后由 zjsxwc 于 2011-2-18 10:26 编辑 ]
搜索更多相关主题的帖子: 幂级数 color 自然 
2011-01-20 13:48
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
得分:3 
难..不懂.
2011-01-20 14:02
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
得分:0 
查了下资料,我们笔算自然对数是靠查自然对数表的,而自然对数表是这么推的


我想知道的是难道math。h里有自然对数表?就算有那得存储多大空间啊

[ 本帖最后由 zjsxwc 于 2011-1-20 15:10 编辑 ]

The tools I recommended:
GUI: CSharp(VS), QT;    Core Code: Plain C (Tiny C Compiler);    Web: Python, JavaScript;    Android: Java;    Embedded System: ASM&C (Linux)
2011-01-20 14:57
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
得分:0 
没人知道吗?

The tools I recommended:
GUI: CSharp(VS), QT;    Core Code: Plain C (Tiny C Compiler);    Web: Python, JavaScript;    Android: Java;    Embedded System: ASM&C (Linux)
2011-01-20 19:29
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
得分:3 
字符串与数值混合操作
例如,遇到一个极大数时461513516545616546545646541,将它转变为字符串形式,然后对它进行操作

小代码,大智慧
2011-01-20 19:37
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
得分:0 
回复 5楼 点线面
那你总要先把怎么算 ln(461513516545616546545646541) 的方法先弄懂吧,然后再用高精度,说吧怎么算啊,这么大的数调用log函数肯定是不行的

The tools I recommended:
GUI: CSharp(VS), QT;    Core Code: Plain C (Tiny C Compiler);    Web: Python, JavaScript;    Android: Java;    Embedded System: ASM&C (Linux)
2011-01-20 19:44
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
得分:0 
你还没有转过来,那么大的数,任何单一类型储存肯定不行,动态数组或者链表可以储存那些极大数,只要空间足够就OK,麻烦是你要对一区域一区域进行操作,顺便说你的方法,就算解决长度问题,如果处理太多数据,速度变得很慢,可行是将一个极大数看作一个常量,然后再用你方法或者其它处理,尽可能处理数据次数低一点

[ 本帖最后由 点线面 于 2011-1-20 19:55 编辑 ]

小代码,大智慧
2011-01-20 19:51
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
得分:0 
问题是我不知道怎么算ln函数

The tools I recommended:
GUI: CSharp(VS), QT;    Core Code: Plain C (Tiny C Compiler);    Web: Python, JavaScript;    Android: Java;    Embedded System: ASM&C (Linux)
2011-01-20 19:55
lyj23
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:140
注 册:2010-10-31
得分:3 
我才初一,没学过,帮不上了!SORRY
2011-01-20 19:58
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
得分:0 
看来,对牛弹

小代码,大智慧
2011-01-20 19:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-331356-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.327410 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved