一直知道CSDN,今日才注册,过来发第一帖最近做一个仿真,零值条件下的参数确定:要求为寻找k1、k2使 w 趋向于零。
在仿真中出现一个问题:
在for循环的步进为0.05,按说该k2=0出现,可运行一直显示为 k2=6.93889e-17 这样的值。源程序如下
#include <iostream.h>
void main()
{
double n1=1.5,n2=1.35,n3=1.38,k1=0,k2=0,k=1,r1=0,r2=0,a1=0,a2=0,b1=0,b2=0,w=0,beta=0;
for(k1=-0.4;k1<0;k1=k1+0.05)
{
for(k2=-0.4;k2<0.4;k2=k2+0.05)
{
k=k1+k2;
if(k!=0)
{
beta=k1/k;
a1=-n1*n1*k1*k1*k1;
a2=n2*n2/((n2-n1)*(n2-n1));
b1=(1-beta)*(n2-n3*beta)*(n2-n3*beta)*(n3*n3*beta-n2*n2)*k*k*k*k;
b2=(n3-n2)*(n3-n2)*n2*n2*n3*n3*k2;
w=a1/a2+b1/b2; //0.125*h*h*h*h*=0.0000125
if(w>-0.0001&&w<0.0001)
cout<<k1<<"     "<<k2<<"    "<<w<<endl;
}
}
}
}

解决方案 »

  1.   

    对没有出现k2=0 感到困惑吗?
    浮点数表达数的时候往往不是正好,有误差。期待浮点数变量等于某一个值的想法,在技术上是不对的。浮点数写成下面的形式是不安全的。
    if (a/b == c/d)
    {... ...}但可以
    if (abs((a/b - c/d) < 0.0001)
    {... ...}浮点数有一个机器零的状态。
    尾数=0000......000(比如用原码)
    指数=0000......000(移位补码,全零是最负,也就是最小)
    除了赋值操作,比如a=0.0; 很难说哪个时候的a等于零。