Saat menggunakan pow() dari perpustakaan cmath saya mendapatkan NaN tetapi jika saya mengulangi untuk panjang daya, itu berfungsi?

Saya mencoba mengevaluasi y=0.05*(1+-2.01655)^x di mana 90 < x < 180 dan saya menerima NaN saat menggunakan pow((1+-2.01655),x) tetapi mengulangi dalam for loop mencapai jawaban yang benar? Perlu dicatat excel juga menunjukkan masalah serupa (tidak dapat mengevaluasi bentuk mentah tetapi dapat mengevaluasi bentuk tersegmentasi).

double var = -1.01655;
double final = 1;
for(int i=0 ; i<ceil(x); i++){
   final *= var;
}
final = 0.05 * final;
0
Grant Dare 14 Agustus 2019, 04:25

1 menjawab

Jawaban Terbaik

Mengambil eksponen pecahan dari suatu bilangan menyiratkan operasi akar ke-n; misalnya pow(2, 3.0 / 2.0) == sqrt(pow(2, 3)).

Bilangan negatif sering memiliki akar imajiner. std::pow untuk ganda hanya menangani real. 1 - 2.01655 tentu saja negatif, jadi persamaan Anda hanya memiliki hasil nyata untuk nilai bilangan bulat x. Saya pikir Anda akan menemukan bahwa nilai integer x menghasilkan hasil dan nilai non-integer menghasilkan NaN. Alasan loop Anda berfungsi adalah karena Anda menghitung kekuatan bilangan bulat, bukan kekuatan pecahan.

Lihat cppreference; bagian tentang penanganan kesalahan:

Jika basis terbatas dan negatif dan exp terbatas dan bukan bilangan bulat, kesalahan domain terjadi dan kesalahan rentang dapat terjadi.

1
James Picone 14 Agustus 2019, 03:06