當我執行這個問題時,結果往往是"-nan "或 "nan" 我是編程新手,所以這有點令人困惑。
`
#include <iostream>
#include <cmath>
using namespace std;
//二次方程
int main() {
/Variables
double a、b、c、n、z、x1、x2、r。
//輸入
cout<<"Quadartic Equation Calculator"<<endl<<endl。
cout<<"你的'a'值是多少?:"<<endl。
cin>>a。
cout<<"你的'b'值是多少?:"<<endl。
cin>>b。
cout<<"你的'c'值是多少?:"<<endl。
cin>>c。
//計算
n = -b;
z = sqrt((b*b)-(4*a*c))。
r= 2*a;
x1 = (n (z))/r;
x2 = (n-(z))/r;
//output
cout<<"你的解決方案是。 "<< x1 << " 或 "<< x2;
return 0。
}
`
uj5u.com熱心網友回復:
std::sqrt()在<cmath>頭中期望其引數是一個正數,如果不是,它將回傳nan這就是你所面對的。它還會引發FE_INVALID浮點例外,你可以在呼叫std::sqrt()函式后用std::fetestexcept(FE_INVALID)驗證。
在實際數學中,負數的平方根會導致復數。普通的浮點型別,如double,通常遵循IEEE-754標準,無法表示復數。為此,你需要使用像std::complex<double>這樣的東西,它實際上能夠將復數存盤在里面。
下面是你修改后的代碼,以利用std::complex<double>,并將正確地分別列印負實數方根的實部和虛部,而不是像以前那樣簡單地回傳nan。
#include <iostream>
#include <complex>
using namespace std;
double abs_zero(double const x) {
return x == 0 ? 0 : x;
}
int main() {
//span>變數
complex<double> a, b, c, n, z, x1, x2, r;
//輸入
cout << "Quadartic Equation Calculator" << endl < < endl。
cout << "你的'a'值是多少?:" << endl。
cin >> a。
cout << "你的'b'值是多少?:" << endl;
cin >> b。
cout << "你的'c'值是多少?:" << endl;
cin >> c。
//計算
n = -b;
z = sqrt((b * b) - (complex< double>(4, 0) * a * c))。
r = complex<double>(2, 0) * a。
x1 = (n z) / r;
x2 = (n - z) / r;
x1 = complex<double> (abs_zero(real(x1)), abs_zero(imag(x1));
x2 = complex<double> (abs_zero(real(x2)), abs_zero(imag(x2)) );
//輸出
if (imag(x1) == 0)
cout << "你的解決方案是。" << real(x1) << " or "<< real(x2) < < endl;
else
cout << "你的解決方案是。" << x1 << " 或 " << x2 << endl。
}
uj5u.com熱心網友回復:
"常常 "最后變成nan或-nan?那是預期的行為。二次方程給你的是方程的根,即圖形與X軸相交的地方。并非所有的二次方程都與x軸相交。
當你將一個不與x軸相交的二次方程輸入到二次方程公式中時,你最終會在方程的平方根中得到一個負數,這將導致一個虛數,它不能被float/double資料型別所表示,因此你得到 "nan "或"-nan"。
uj5u.com熱心網友回復:
NAN是 "Not a Number "的縮寫,是一個例外,通常發生在一個數字不能被表示的情況下。它可能是sqrt((bxb)-(4ac))導致的錯誤,因為對于某些輸入,該輸入的平方根是未定義的。例如,在a=5、b=4和c=3的情況下,sqrt((bxb)-(4ac))是未定義的,因為它是負數的平方根。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/306729.html
標籤:
