zoukankan      html  css  js  c++  java
  • 程序中关于浮点数计算的问题

    在进行数值计算编程的过程中往往需要用到浮点数的计算,但浮点数的加减运算通常是会出现误差的。具体出现问题代码如下:

     double begin = 0.0; //起始位置

    double end = 20.0;  //结束位置

     int k = 2;  //核函数支持半径的倍数

    double initialDis = 0.1;   //粒子间的初始距离(需要与粒子的控制体积保存一致性)

    /*****************第一步初始化粒子**********/
    for(double i=begin-(2*k-1)*initialDis/2; i<=end+(2*k)*initialDis/2; i=i+initialDis)
    {
    par = new LNode;//申请内存空间
    (*par).data.changeCoordinate(i,0.0);//更新坐标
    (*par).data.changeMass(mass); //更新质量
    if(i<begin)
    {
    (*par).data.changeType(itghost); //更新粒子类型为itghost
    (*par).data.changePressure(Pr);//更新压力(初始值)
    (*par).data.changeVelocity(V0,0);//更新速度(初始值)
    }
    else if(i>=begin&&i<begin+initialDis)//inlet粒子
    {
    // cout<<"itoutlet<><><><><><>"<<i<<endl;
    (*par).data.changeType(itinlet); //更新粒子类型为inlet
    (*par).data.changePressure(Pr-i*Pf);//更新压力(初始值)
    (*par).data.changeVelocity(V0,0);//更新速度(初始值)
    }
    else if(i<=end&&i>end-initialDis)//outlet粒子
    {
    (*par).data.changeType(itoutlet); //更新粒子类型为outlet
    (*par).data.changePressure(Pr-i*Pf);//更新压力(初始值)
    (*par).data.changeVelocity(V0,0);//更新速度(初始值)
    }
    else if(i>end)//outmirror粒子
    {
    (*par).data.changeType(itmirror); //更新粒子类型为itmirror
    (*par).data.changePressure(Pr-(2*end-(40-i))*Pf);//更新压力
    (*par).data.changeVelocity(0,0);//更新速度(初始值)
    }

    else
    {
    (*par).data.changeType(itfluid); //更新粒子类型为fluid
    (*par).data.changePressure(Pr-i*Pf);//更新压力(初始值)
    (*par).data.changeVelocity(V0,0);//更新速度(初始值)

    }
    (*par).next = (*totalPar).next;//头插法插入链表
    (*totalPar).next = par;
    }

    如上述代码所示,在计算粒子的位置时需要进行浮点数的计算,但经过若干次加法计算,结果并不能和预期相同,inlet粒子的位置应为0.0,实际计算中,是通过0.1相加出来的,并不等于0.0,所以判断粒子为inlet粒子的条件根据具体的情况修改为(i>=begin&&i<begin+initialDis)。

  • 相关阅读:
    同上 Database Software Engineer(数据库软件设计工程师)
    通用电气医疗系统(中国)有限公司
    ge医疗无锡 招聘大量嵌入式软件开发人员
    Test Engineer (测试工程师)
    Flex beta2+XFire开发实例(二)
    flexmdi代码开放
    造船管理精细化
    Flex应用开发由浅入深系列1
    Flex beta2+XFire开发实例
    ILOG Diagrammer.NET 1.000 License Key
  • 原文地址:https://www.cnblogs.com/hcysblog/p/5459927.html
Copyright © 2011-2022 走看看