非常令人困惑的一个C++程序
程序如下:#include<iostream>
#include<cmath>
#include<fstream>
#define max 10000
using namespace std;
int main()
{
int N; /* 定义相关变量及数组 */
double w[max][3]={0};
double k[2][5]={0}; /* 存放斜率的数组,行代表方程标号,列代表每一个方程的四个斜率 */
double f1(double t,double y1,double y2);
double f2(double t,double y1,double y2);
double a,b;
cout<<"请从小到大依次输入区间的上下界:\n"<<endl;/* 输入相关参数 */
cin>>a>>b;
cout<<"你想把区间划分成多少分呢?请输入:\n"<<endl;
cin>>N;
double h=(b-a)/N;
cout<<"步长 h="<<h<<endl;
w[0][0]=-0.4000; /* 在循环之前,先对各变量初始化 */
w[0][1]=-0.6000; /* 存放近似数值解的数组,行代表迭代次数,列代表方程的个数 */
for(int i=1;i<N;i++) /* 控制迭代次数 */
{
for(int j=0;j<2;j++)
{
k[1][1]=h*f1(a+(i-1)*h,w[i-1][0],w[i-1][1]); /* 行表示方程标号,列表示每个方程k的标号 */
k[2][1]=h*f2(a+(i-1)*h,w[i-1][0],w[i-1][1]);
k[1][2]=h*f1(a+(i-10)*h+h/2.0,w[i-1][0]+1.0/2*k[1][1],w[i-1][1]+1.0/2*k[2][1]);
k[2][2]=h*f2(a+(i-1)*h+h/2.0,w[i-1][0]+1.0/2*k[1][1],w[i-1][2]+1.0/2*k[2][1]);
k[1][3]=h*f1(a+(i-1)*h+h/2.0,w[i-1][0]+1.0/2*k[1][2],w[i-1][2]+1.0/2*k[2][2]);
k[2][3]=h*f2(a+(i-1)*h+h/2.0,w[i-1][0]+1.0/2*k[1][2],w[i-1][2]+1.0/2*k[2][2]);
k[1][4]=h*f1(a+(i-1)*h+h,w[i-1][1]+1.0/2*k[1][3],w[i-1][2]+1.0/2*k[2][3]);
k[2][4]=h*f2(a+(i-1)*h+h,w[i-1][1]+1.0/2*k[1][3],w[i-1][2]+1.0/2*k[2][3]);
w[i][0]=w[i-1][0]+1.0/6*(k[1][1]+2*k[1][2]+2*k[1][3]+k[1][4]);
w[i][1]=w[i-1][0]+1.0/6*(k[2][1]+2*k[2][2]+2*k[2][3]+k[2][4]);
}
}
for(int m=0;m<N;m++)
cout<<w[m][0]<<" "<<w[m][1]<<endl;
return 0;
}
double f1(double t,double y1,double y2)
{
return y2;
}
double f2(double t,double y1,double y2)
{
return (exp(2*t)-2*y1+2*y2);
}
我单步运行程序观察变量值的变化,一开始用 w[0][1]=-0.6000;给数组元素赋值,但是竟然发现w[0][1]自己无缘无故变成了0.06,这太让人困惑了,因为我反复检查程序,我并没有改变w[0][1]的值啊,为什么它竟然会自己改变值呢?
附上截图:
截图中w[0][1]=0.060000000000012,真是百思不得其解,我明明给它赋的值是w[0][1]=-0.6000啊,盼望大侠来指教一下
追问:来自手机问问就算是不准可是难道-0.6在内存中是以0.06存储的吗?我对这个了解不是太多,还请多指点指点