C 变量的范围有什么问题?

C 变量的范围有什么问题?,c,C,我几乎没有编程经验,但我必须编写一个简单的C程序,将比热Cp计算为温度T的函数。 为了获得精确的Cp值,将温度范围分为更小的范围 #include <stdio.h> #include <math.h> int main() { float T, cp1, cp2, cp3, cp4, cp5, cp6, cp7, cp8; /*variables */ printf( "Please enter

我几乎没有编程经验,但我必须编写一个简单的C程序,将比热Cp计算为温度T的函数。 为了获得精确的Cp值,将温度范围分为更小的范围

#include <stdio.h>  
#include <math.h>

int main()
{    
    float T, cp1, cp2, cp3, cp4, cp5, cp6, cp7, cp8;                     /*variables */  

    printf( "Please enter temperature in Kelvin\n" );  /* Asks for temperature */
    scanf( "%f", &T );

    cp1=1.67662377469456E-11*pow(T,6.)-4.1197828092268E-08*pow(T,5.)+0.0000418869586791152*pow(T,4.)-0.0225003443462658*pow(T,3.)+6.72987826198519*pow(T,2.)-1062.18721205927*T+73195.8387080729;
    cp2=0.00525246395569212*pow(T,4.)-12.9485474717992*pow(T,3.)+11970.600895997*pow(T,2.)-4918448.82178862*T+757825839.152518;
    cp3=6.63085194968153*pow(T,4.)-17170.4000395659*pow(T,3.)+16673480.6519115*pow(T,2.)-7196031423.69135*T+1164647463146.08;
    cp4=-68.0819524480029*pow(T,5.)+222554.556013276*pow(T,4.)-291004129.724188*pow(T,3.)+190252342532.153*pow(T,2.)-62191220562433.3*T+8131793672657510;
    cp5=9974.74747475981*pow(T,3.)-19674382.9004572*pow(T,2.)+12935329616.4157*T-2834856258114.32;
    cp6=-4.14962557364299E-07*pow(T,6.)+0.000462300031790556*pow(T,5.)-0.0310330512189478*pow(T,4.)+62.8598088326175*pow(T,3.)-189691.032172151*pow(T,2.)+77129922.3433911*T-4056849697.67083;
    cp7=1.47773054803578E-08*pow(T,6.)-0.0000239186385308144*pow(T,5.)+0.00563616606939476*pow(T,4.)+1.50391266948934*pow(T,3.)+9118.7111011683*pow(T,2.)-8897122.07353999*T+2172208386.41784;
    cp8=-4.6626284146362E-08*pow(T,5.)+0.000192659539297423*pow(T,4.)-0.318404373982708*pow(T,3.)+263.141418952148*pow(T,2.)-108775.736711323*T+18001673.992402;


    if (T>=280. && T<=599.9) {                      /* 1st temp range !!! If 599.9 is entered, the program calculates cp2 instead of cp1*/ 
        printf ("1st range Cp= %.6f J/kgK",cp1);                    /* returns cp1 */
    }
    else if (T>599.9 && T<=646.8) {            /* 2nd temp range */ 
        printf("2nd range Cp= %.6f J/kgK",cp2);                 /* returns cp2 */
    }
    else if (T>646.8 && T<=651.2) {            /* 3rd temp range !!! If 651.2 is entered, the program calculates cp4 instead of cp3*/ 
        printf("3rd range Cp= %.6f J/kgK",cp3);                 /* returns cp3 */
    }
    else if (T>651.2 && T<=655.8) {            /* 4th temp range */ 
        printf("4th range Cp= %.6f J/kgK",cp4);                 /* returns cp4 */
    }
    else if (T>655.8 && T<=656.6) {            /* 5th temp range */ 
        printf("5th range Cp= %.6f J/kgK",cp5);                 /* returns cp5 */
    }
    else if (T>656.6 && T<=662.) {            /* 6th temp range */ 
        printf("6th range Cp= %.6f J/kgK",cp6);                 /* returns cp6 */
    }
    else if (T>662. && T<=700.) {            /* 7th temp range */ 
        printf("7th range Cp= %.6f J/kgK",cp7);                 /* returns cp7 */
    }
    else if (T>700. && T<=900.) {            /* 8th temp range */ 
        printf("8th range Cp= %.6f J/kgK",cp8);                 /* returns cp8 */
    }
    else {
        printf("Cp= 4180 J/kgK");     /* Executed if no other statement is */
    }

  return 0;
}
该代码可能并不优雅,但除了第1个范围和第3个范围外,它都有效

对于第一个范围

if (T>=280. && T<=599.9) {                      /* 1st temp range If 599.9 is entered, the program calculates cp2 instead of cp1*/ 
        printf ("1st range Cp= %.6f J/kgK",cp1);                    /* returns cp1 */
    }
如果输入T等于599.9,则值Cp的计算将使用方程式cp2而不是cp1完成。 第三个温度范围也会发生同样的情况。如果我输入T等于651.2,则Cp用cp4而不是cp3计算。 我不明白为什么。剩下的就行了。 代码是用可移植的Dev-C++5.11编译的

谢谢

这与浮点不精确性以及混合双精度和浮点类型有关

599.9是双精度浮点文字,T是浮点

比较T与浮点不精确性以及混合双精度和浮点类型有关

599.9是双精度浮点文字,T是浮点


比较T原因是不幸的是,计算机不能100%准确地表示每个数字

如果在读入后打印出T的值,实际上得到的是599.9000024,当然大于599.9,并使用第3条语句


您可以暂时使用双类型而不是精度更高的浮点来解决这个问题。

原因是不幸的是,计算机无法100%准确地表示每个数字

如果在读入后打印出T的值,实际上得到的是599.9000024,当然大于599.9,并使用第3条语句


您可以暂时使用双精度类型而不是精度更高的浮点类型来解决此问题。

这可能是因为您正在转换浮点和双精度,从而引入舍入错误。float1==float2永远都不可靠,这是一种经验法则。双打也是一样

这可能是因为您正在转换浮点和双精度,从而引入舍入错误。float1==float2永远都不可靠,这是一种经验法则。双打也是一样

不可靠?浮点比较不是随机的。只是人们的期望值是错误的。比较是可靠的,而你是否能做到这一点,同时又有意义,则取决于实际的数字。在这两种语言中都有可以有限表示的值。这里的陷阱是人们在与他们打交道时有错误的期望。嗯,这就是我的意思。如果你知道你的生意,就去做吧,如果你不知道,就不要相信;不可靠?浮点比较不是随机的。只是人们的期望值是错误的。比较是可靠的,而你是否能做到这一点,同时又有意义,则取决于实际的数字。在这两种语言中都有可以有限表示的值。这里的陷阱是人们在与他们打交道时有错误的期望。嗯,这就是我的意思。如果你知道你的生意,就去做吧,如果你不知道,就不要相信;如果精度更高,您可能只会将问题进一步转移到更无关紧要的数字中——也不能保证599.9可以准确地表示为双精度。也就是说,它仍然可以在至少OP未知的方向上随意向上或向下取整。建议:如果T>=280,则进行更改T=280TI遵循了您的建议599.9f,现在它可以工作了。感谢更高的精度,您可能只会将问题进一步转移到更无关紧要的数字中–也不能保证599.9可以准确地表示为双精度。也就是说,它仍然可以在至少OP未知的方向上随意向上或向下取整。建议:如果T>=280,则进行更改T=280TI遵循了您的建议599.9f,现在它可以工作了。谢谢