33,006
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
double b ,x0;
int px(int i);
int calc_f(int i);
int calc_g(int i);
double calc_x(int i);
int i;
int px(int t) //2的指数函数
{
int a,r,b =1;
if(t == 0)
return 1;
for(a = 1;a<=t;a++)
{
r = b*2;
b = r;
}
return b;
}
#define N 16
//vf/vg/vx 存储 calc_f/calc_g/calc_x的结果
//bf/bg/bx 标识对应结果是否已计算过
int vf[N], vg[N];
double vx[N];
bool bf[N], bg[N], bx[N];
int calc_f ( int i )
{
int j,k,c = 0;
double xi;
if(bf[i]) return vf[i];
if(i == 0) //取得待处理浮点数 xi
xi = x0;
else
xi = calc_x(i-1);
bool datal[15] ,datam[15] ,datah[15],datax[45],dataf[15];
int calc[15];
for(j = 0;j<45;j++)//把浮点数小数部分的前45位存入datax[45]
{
if(xi*2 >1)
{
datax[j] = 1;
xi = xi*2 -1;
}
else
{
datax[j] = 0;
xi = xi*2 ;
}
}
for(j = 0;j<15;j++) //把1~15位赋给datal,16~30位赋给datam,31~45位赋给datah
{
datal[j] = datax[j] ;
datam[j] = datax[j+15] ;
datah[j] = datax[j+30] ;
}
for(j = 0;j<15;j++) //datal,datam,datax异或,异或值1~15位表示一个15位二进制数的各个位,求出这个数
{
dataf[j] = datal[j]^datam[j]^datah[j] ;
calc[j] = (dataf[j]<<(14-j)) ;
c = c +calc[j];
}
vf[i] = c;
bf[i] = true;
return c;
}
int calc_g ( int i ) //实现g(i) = f(1)^f(2)^...^f(i) = g(i-1)^f(i)
{
if(bg[i]) return vg[i];
if( i == 0)
vg[i] = calc_f ( 0 );
else
vg[i] = (calc_g( i -1 )^ calc_f( i ));
bg[i] = true;
return vg[i];
}
double calc_x (int i) //计算calc_f(i)函数所需要的xi变量
{
int j,ki;
double x_next , x_now ;
if(bx[i]) return vx[i];
int g = calc_g(i) ; //调用calc_g(i)
int noise = 5 ; //这里本来是用一个noise函数。。无奈递归调用太多,直接栈溢出了
ki = ( g ^ noise ) % 73;//计算(计算x_next)需要循环的次数
if(i == 0) //由xi计算xi+1,函数返回值为x_next=xi+1
x_now = x0;
else
x_now = calc_x(i-1);
for(j = 0;j < ki;j++)
{
x_next = b * x_now * ( 1 - x_now );
x_now = x_next ;
}
vx[i] = x_next;
bx[i] = true;
return x_next;
}
main() //查看函数执行情况
{
memset(bf, 0, sizeof(bf));
memset(bg, 0, sizeof(bg));
memset(bx, 0, sizeof(bx));
x0 = 0.4234235,b = 3.6575757;
for(i = 0;i<15;i++)
{
calc_f(i);
calc_g(i);
calc_x(i);
}
for(i = 0;i<15;i++)
{
printf("%8d",calc_f(i));
printf("%8d",calc_g(i));
printf("%15f\n",calc_x(i));
}
}