精度问题和类型转换问题

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void main()
{
	string str;
	char *s;//读取文件中的字符串
	double **Yto;//周期分组
	double *Y;//数据
	double *Yi; //均值
	double *ss;    //方差
	double *sk;      //平方差
	int L;      //周期数
	int count=0;
	ifstream read("data.dat");//打开文件
	while(!read.eof())
	{
		read>>str;
		count++;          //计算文件行数
	}
	read.close();       //关闭文件
	s=new char[15];
	Y=new double[count];
	ofstream dd("out.dat");
	ifstream r("data.dat");
	int i=0;         //数组下标
	while(!r.eof())
	{
		r>>s;
		Y[i]=atof(s);      //将char 转换为double
		i++;
	}
	r.close();
	int kk=0;
	ss=new double[66-2+1];
	sk=new double[66-2+1];
	double temp;      //平均方差最小缓存
	int km=0;        //平均方差最小所对应的周期
	for(int k=2;k<66;k++)          //分组
	{
		L=(count-1)/k;
		Yto=(double **)new double *[L];
		for(int j=0;j<L;j++)
		{
			Yto[j]=new double[k];
		}
		int n=0;
		for(int m=0;m<L;m++)
		{
			for(int mm=0;mm<k;mm++)
			{
				Yto[m][mm]=Y[n];
				n++;
			}
		}
		Yi=new double[k];
		for(int nn=0;nn<k;nn++)
		{
			double sum=0;
		    for(int m=0;m<L;m++)
		    {
			   sum+=Yto[m][nn];
		     }
			Yi[nn]=(double)sum/(L+1);      //求均值
			dd<<"均值Y"<<nn<<"为"<<Yi[nn]<<endl;
		}
		ss[kk]=0;
		sk[kk]=0;
		for(int nn=0;nn<k;nn++)       //求方差
		{
			double ssum=0;
			for(int m=0;m<L;m++)
			{
				ssum+=(Yto[m][nn]-Yi[nn])*(Yto[m][nn]-Yi[nn]);
			}
			ss[kk]+=ssum;
		}
		dd<<"周期为"<<k<<"的方差为"<<ss[kk]<<endl;
		sk[kk]=(double)ss[kk]/L;
		dd<<"平均方差为"<<sk[kk]<<endl;
		if(kk==0)          //选择最小平均方差
		{
			temp=sk[kk];km=k;
		}
		if(kk>0&&temp>sk[kk])
		{
			temp=sk[kk];
			km=k;
		}
		kk++;
	}
	dd<<"最小平均方差所对应的周期为"<<km<<endl;
	dd.close();
	
	system("pause");
}

原文地址:https://www.cnblogs.com/zztong/p/6695290.html