- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12787
- 在线时间
- 小时
|
楼主 |
发表于 2012-3-5 18:14:05
|
显示全部楼层
给出求渐进连分数的代码,方便自己和别人参考。- #include "stdafx.h"
- #include "math.h"
-
- typedef int BASE_INT_TYPE;
- typedef __int64 DOUBLE_INT_TYPE;
-
- typedef struct _base_pair
- {
- DOUBLE_INT_TYPE p;
- DOUBLE_INT_TYPE q;
- }BASE_PAIR;
-
- typedef struct _base_pair_3e
- {
- BASE_PAIR d[3];
- }BASE_PAIR_3E;
-
- void continued_frac_serial(double f)
- {
- BASE_INT_TYPE a[2];
- BASE_PAIR_3E pqs;
- double cf,tf;
- int i;
-
- tf=f;
- pqs.d[0].p=a[0]=(BASE_INT_TYPE)(tf);
- pqs.d[0].q=1;
- cf=(double)(pqs.d[0].p)/(double)(pqs.d[0].q);
- printf("\nf=%.16f\n[0]:%I64d/%I64d=%.16f\n",f,pqs.d[0].p,pqs.d[0].q,cf);
-
- tf -= a[0];
- tf=1.0/tf;
- for (i=1;1;i++)
- {
- a[1]= (BASE_INT_TYPE)(tf);
- tf -= a[1];
- tf=1.0/tf;
-
- if (i==1)
- {
- pqs.d[1].p = pqs.d[0].p * a[1] +1; //p1=a0 * a1+1
- pqs.d[1].q = a[1]; //q1=a1
- cf=(double)(pqs.d[1].p)/(double)(pqs.d[1].q);
- }
- else
- {
- pqs.d[2].p= pqs.d[1].p * a[1] + pqs.d[0].p; //p[n]= a[n] * p[n-1] + p[n-2];
- pqs.d[2].q= pqs.d[1].q * a[1] + pqs.d[0].q; //q[n]= a[n] * q[n-1] + q[n-2];
- cf=(double)(pqs.d[2].p)/(double)(pqs.d[2].q);
- }
-
- printf("[%d]:%I64d/%I64d=%.16f\n",i,pqs.d[1].p,pqs.d[1].q,cf);
- if ( fabs(cf-f) < f * 2.3e-16)
- {
- break;
- }
-
- a[0]=a[1];
- if (i>=2)
- {
- pqs.d[0].p=pqs.d[1].p;
- pqs.d[0].q=pqs.d[1].q;
- pqs.d[1].p=pqs.d[2].p;
- pqs.d[1].q=pqs.d[2].q;
- }
- }
- }
-
- void test1()
- {
- double f;
- f=3.1415926535897932384626433832795;
- continued_frac_serial(f);
- f=log(3.0)/log(2.0); continued_frac_serial(f);
- f=log(5.0)/log(2.0); continued_frac_serial(f);
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- test1();
- return 0;
- }
复制代码 |
|