求教各位大神:程序计算问题

采用C#编写的程序,给定初值然后计算,程序很简单,只有两个循环。为什么有的初值能算有的不能算?
例如1500能算,但是2500就不能算了,3500能算,但是5500又算不通了?这是什么原因?

非常谢谢!!!

5个回答

不能算是什么鬼,是程序崩溃,还是计算的结果不对

liusing712
liusing712 回复qq_34658785: 已经解决了,谢谢!
3 年多之前 回复
qq_34658785
卖太妃糖的古尔丹 回复liusing712: 我在网上看了下,大致的意思是说,当你除于零的是时候,由于数学当中,除数不能为零,其结果为无穷大,C#的规则是会得出NaN的结果,你自己看下算不出来的数,你代入一下看是不是哪里除数为零了,像这种你应该做一下限制,不允许除数为零,保证代码的健壮性
3 年多之前 回复
liusing712
liusing712 回复qq_34658785: 比如,输入T=316.26,P=7032900能算,但是输入T=316.26,P=10480400就算不通了。
3 年多之前 回复
liusing712
liusing712 回复qq_34658785: 贴出来了,请您再看看,谢谢您了。
3 年多之前 回复
qq_34658785
卖太妃糖的古尔丹 回复liusing712: NAN意思是not a number,你是程序里是不是有非法字符,贴出来看看
3 年多之前 回复
liusing712
liusing712 就是卡着算不动啊,等20多分钟,算完后显示NAN
3 年多之前 回复

因为你的程序写错了。

liusing712
liusing712 那我在检查检查
3 年多之前 回复

for循环写的好。。。怎么会计算错误。。

liusing712
liusing712 您的意思是for循环出现了问题?
3 年多之前 回复

你把代码贴出来看看,这样直接说不明白

liusing712
liusing712 贴出来了,麻烦您看看,谢谢哈。
3 年多之前 回复
        //*通过窗体赋值*//
        string strPath = Application.StartupPath + "\\test.accdb";
        bp.P = double.Parse(textBox1.Text);
        bp.T = double.Parse(textBox2.Text);

        double pbS8;                        
        pbS8 = 1000000 * Math.Pow(10, (3.1115 - 2442.4 / (bp.T - 106.50)));
        double vS8S;
        vS8S = 8 * 32.064 / 2070000;
        bp.fS8S = pbS8 * Math.Exp(vS8S * (bp.P - pbS8) / 8.314 / bp.T);            
        bp.bS8= bp.Ω * 8.314 * 1025.0 / 5200000;       
        bp.bH2S = bp.Ω * 8.314 * 373.55 / 8970000;                     
        bp.b = bp.yS8 * bp.bS8 + 1.0 * bp.bH2S;            
        bp.β = bp.b * bp.P / 8.314 / bp.T;             
        double αS8 = Math.Pow(1.0 + (0.37464 + 1.54226 * 0.3805 - 0.26992 * 0.3805 * 0.3805) * (1.0 - Math.Pow(bp.T / 1025, 0.5)), 2);
        double αH2S = Math.Pow(1.0 + (0.37464 + 1.54226 * 0.1 - 0.26992 * 0.1 * 0.1) * (1.0 - Math.Pow(bp.T / 373.55, 0.5)), 2);            
        double aS8 = bp.Ψ * αS8 * 8.314 * 8.314 * 1025 * 1025 / 5200000;
        double aH2S = bp.Ψ * αH2S * 8.314 * 8.314 * 373.55 * 373.55 / 8970000;            
        bp.a = bp.yS8 * bp.yS8 * aS8 + 2 * bp.yS8 * 1.0 * (1 - 0.0758) * Math.Pow(aH2S * aS8, 0.5) + 1.0 * 1.0 * aH2S;            
        bp.q = bp.a / bp.b / 8.314 / bp.T;
        double z, z1;
        z1 = 0.2;
        z = 0.2;
        for (int i = 1; i < 1000000; i++)
        {
            z = 1.0 + bp.β - bp.q * bp.β * (z1 - bp.β) / (z1 - 0.4142 * bp.β) / (z1 + 2.4142 * bp.β);
            if (Math.Abs(z - z1) <= 0.00001)
            {
                z = z1;
                bp.Z = z1;
                break;
            }
            else
            {
                z1 = z;
            }
        }            
        bp.qS8 = bp.q * (2 * (bp.yS8 * aS8 + 1.0 * (1.0-0.0758)*Math.Pow(aS8*aH2S,0.5)) / bp.a - bp.bS8 / bp.b);            
        bp.I = 1.0 / 2 / 1.4142 * Math.Log((bp.Z + 2.4142 * bp.β) / (bp.Z - 0.4142 * bp.β), 2.71828183);            
        bp.фS8 = Math.Exp(bp.bS8 * (bp.Z - 1.0) / bp.b - Math.Log((bp.Z - bp.β), 2.71828183) - bp.qS8 * bp.I);            
        double yS81;
        bp.yS8 = 0.1;
        for (int i = 1; i <= 1000000000; i++)
        {
            yS81 = bp.fS8S / bp.фS8 / bp.P;
            if (Math.Abs(yS81 - bp.yS8) <= 0.00001)
            {
                bp.yS8 = yS81;
                break;
            }
            else
            {
                bp.yS8 = yS81;
            }
        }



    }
    //*定义全局参数*//
    public class bp
    {
        public static double T;  
        public static double P; 
        public static double fS8S; 
        public static double Ω=0.07780; 
        public static double Ψ=0.45742; 
        public static double yS8; 
        public static double Z; 
        public static double bS8;
        public static double bH2S;
        public static double b;
        public static double фS8;
        public static double I;
        public static double qS8;
        public static double a;
        public static double q;
        public static double β;

    }

    private void button1_Click(object sender, EventArgs e)
    {
        //输出
        textBox3.Text = bp.yS8.ToString();            
    }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问