Почему C ++ показывает неправильный номер? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть маленький расчет. Прямо сейчас я вычисляю p_o, и значение, которое я получаю, является правильным, но каким-то образом p_TR, откуда оно получает значение, отображается неправильно. Я получаю следующие значения: p_o = 0,3067666187328126 (справа) p_TR = 6,94807050163253e-310 (неверно)

Как вы можете видеть ближе к концу кода, он говорит: p_o = p_TR

Я компилирую код на Opensuse в оболочке с помощью команды g ++.

Я читал, что числа с плавающей точкой меняются в десятичных точках, но я бы сказал, что это не то же самое.

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;
int main ()
{
    //Header der angezeigt wird bei Pragrammstart
    cout << "----------------------------------------------------------------------\n";
    cout << "**********************************************************************\n";
    cout << "----------------------------------------------------------------------\n";
    cout << "===>Exakter\n";
    cout << "======>Riemann\n";
    cout << "=========>Loeser" << endl;
    cout.flush();     

    //physikalische Groessen
    const float k = 1.4;                            //isentropen Exponent
    const float M = 28.9;                           //Molare Masse [g/kmol] des Fluids
    const float R = 8314.51;                        //universelle Gaskonstante [J/(kmol*K)]
    cout << "\nStoff-/Physikalische Groessen\n" << "k=" << k << "; M=" << M << "; R=" << R << endl;

    //Anfangswerte Links
    const float rho_L = 1;                          //Dichte [kg/m^3]
    const float u_L = 0;                            //Geschwindigkeit [m/s]
    const float p_L = 1;                            //Druck  [Pa]
    const double T_L = (p_L*M)/(R*rho_L);           //Temperatur[K]
    const double RmT_L = p_L/rho_L;                 //Zwischen Groesse fuer a_L
    const double a_L = pow((k*(R/M)*T_L),(0.5));    //Schallgeschwindigkeit [m/s]
    cout << "\nWerte auf der rechten Seite:\n" << "rho_L=" << rho_L << "; u_L=" << u_L << "; p_L=" << p_L << "; T_L=" << T_L << "; a_L=" << a_L << "; RmT_L=" << RmT_L << endl;

    //Anfangswerte Rechts
    const float rho_R = 0.125;
    const int u_R = 0;
    const float p_R = 0.1;
    const double T_R = (p_R*M)/(R*rho_R);
    const double RmT_R = p_R/rho_R;                 //Zwischen Groesse fuer a_R
    const double a_R = pow((k*(R/M)*T_R),(0.5));
    cout << "\nWerte auf der linken Seite:\n" << "rho_R=" << rho_R << "; u_R=" << u_R << "; p_R=" << p_R << "; T_R=" << T_R << "; a_R=" << a_R << "; RmT_R=" << RmT_R << endl;

    //Allgemeine Anfangswerte
    const float du = u_R-u_L;                                       //Geschwindigkeitsdifferenz [m/s]
    const double du_krit = ((2*a_L)/(k-1)) + ((2*a_R)/(k-1));       //kritische Geschwindigkeitsdifferenz [m/s] (positive Druck Bedingung)
    const double TOL = 1e-6;                                        //Toleranz fuer p*
    cout << "\nWeitere Groessen:\n" << "du=" << du << "; du_krit=" << du_krit << "; TOL=" << TOL << endl;
    cout.flush();


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Variablen Iteration p*
        //Berechnung des Schätzwertes
        double p_o;
        double p_TR;
        if (p_L>0 & p_R>0)
        {
                const double p_TR = pow(((a_L + a_R - 0.5*(k-1)*du)/((a_L/(pow(p_L,((k-1)/(2*k)))))+(a_R/(pow(p_R,((k-1)/(2*k))))))),((2*k)/(k-1)));    //Schaetzwert fuer p0[Pa] als annahme das man 2 Verduennungswellen hat
                //const double p_o = max(TOL,p_TR);                     //erster Schaetzwert , genommen ist Druck fuer 2 Verduennungen
                p_o = p_TR;
                cout << "\nkein Vakuum am Anfang ===> p_TR" << endl;
        }
        else
        {
                const double p_o = 0.5*(p_L+p_R);
                cout << "\n Vakuum am Anfang ===> arithmitische Mittel fuer p_o" << endl;
        }

        //Variablen fuer Iteration
        int n = 1;
        double p_n = p_o;       //p fuer Iterationen
        float CHA = 1;

        //Hilfsvariablen zum einfacheren rechnen
        const double AL = 2/((k+1)*rho_L);
        const double AR = 2/((k+1)*rho_R);
        const double BL = ((k-1)*p_L)/(k+1);
        const double BR = ((k-1)*p_R)/(k+1);

        cout << "\np_TR=" << std::setprecision(16)<< p_TR;
        cout << "\nWerte fuer Iteration:" << "\np_o=" << std::setprecision(16) << p_o << "\nAL=" << AL << "; BL=" << BL << "\nAR=" << AR << "; BR=" << BR << endl;
        cout.flush();

1 Ответ

0 голосов
/ 26 июня 2018

Поскольку вы объявляете p_TR два раза в разных областях, то есть у вас в основном две разные переменные в двух разных областях, имеющие одно и то же имя p_TR. Один экземпляр в основной области, другой экземпляр в вашем блоке if / else.

Та же проблема с p_o в блоке else.

Просто удалите "const double" внутри блока if / else, это должно сработать.

double p_o;
double p_TR;
if (p_L>0 & p_R>0)
{
        p_TR = pow(((a_L + a_R - 0.5*(k-1)*du)/((a_L/(pow(p_L,((k-1)/(2*k)))))+(a_R/(pow(p_R,((k-1)/(2*k))))))),((2*k)/(k-1)));    //Schaetzwert fuer p0[Pa] als annahme das man 2 Verduennungswellen hat
        //const double p_o = max(TOL,p_TR);                     //erster Schaetzwert , genommen ist Druck fuer 2 Verduennungen
        p_o = p_TR;
        cout << "\nkein Vakuum am Anfang ===> p_TR" << endl;
}
else
{
        p_o = 0.5*(p_L+p_R);
        cout << "\n Vakuum am Anfang ===> arithmitische Mittel fuer p_o" << endl;
}
...