C++ 为什么C++;你打错号码了吗?
我有点算计。 现在我计算p_o,得到的值是正确的,但不知怎的,p_TR,它从哪里得到的值,显示的是错误的。 我得到的值是: p_o=0.3067666187328126(右) p_TR=6.94807050163253e-310(错误) 正如您在代码末尾看到的,它说: p_o=p_TR 我使用g++命令在shell中的Opensuse上编译代码 我读到浮点数在小数点上变化,但我想说的不一样C++ 为什么C++;你打错号码了吗?,c++,floating-point,numbers,display,C++,Floating Point,Numbers,Display,我有点算计。 现在我计算p_o,得到的值是正确的,但不知怎的,p_TR,它从哪里得到的值,显示的是错误的。 我得到的值是: p_o=0.3067666187328126(右) p_TR=6.94807050163253e-310(错误) 正如您在代码末尾看到的,它说: p_o=p_TR 我使用g++命令在shell中的Opensuse上编译代码 我读到浮点数在小数点上变化,但我想说的不一样 #include <iostream> #include <iomanip> #i
#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();
#包括
#包括
#包括
使用名称空间std;
int main()
{
//从开始到结束
cout因为在不同的范围内声明了两次p_TR,所以基本上在两个不同的范围内有两个不同的变量,它们的名称相同p_TR。
一个在主作用域中实例化,另一个在if/else块中实例化
else块中的p_o也存在同样的问题
只要删除if/else块中的“constdouble”,就可以了
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;
}
double p_o;
双p_-TR;
如果(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(pR,((k-1)/(2*k)/(k-1));/Schaetzwert-fuer(p)als annahme-das-man 2-verdungswellen帽子
//const double p_o=max(TOL,p_TR);//erster Schaetzwert,genommen和Druck fuer 2 Verdenungen
p_o=p_TR;
当你编译时,这会给你错误或者至少警告,我建议你看看这个(如果需要的话启用-Wall)。你定义p_o和p_TR(double p_o;
…),然后再这样做(const double p_o
=…),删除那里的const double
。另外,如果语句错误,您可能想要的是p\u L>0和&p\u R>0
。我认为这也应该作为一个警告。一般来说,如果编译器给您一个警告,但是编译了,一定要看看它说了什么,您可能犯了一个错误,代码将无法正常工作d、 在最后三分之一行中有一行常量p_o=0.5*(p_L+p_R);
,它将上面定义的p_o变量隐藏了10行。也许这就是问题所在?(应该是“arithmetisches Mittel”)非常感谢^^^不,编译器没有在终端中给出任何错误。我也纠正了其余的错误,谢谢:)编译器可以在gcc和clang上警告这种事情-Wshadow