Что я должен сделать, чтобы «nan» не отображался в консоли?

#c #nan

#c #nan

Вопрос:

Моя учительница дала это домашнее задание. В основном у меня есть два числа, a и b. Я должен показать на консоли ответ этой формулы для каждого добавленного числа » а » h=(b-a)/10, но в консоли я вижу только nan. Как я могу устранить эту ошибку? Мой код таков:

 #include lt;iostreamgt; #include lt;math.hgt; using namespace std; double s(double x){  long f = 1;  long double anw=1;  for(int k=1;klt;=100;k  ){  f=k*f;  anw=((pow((x-1),k)*pow(log(3),k))/f) anw;  }  return anw; } int main(){  double a=0.2, b=0.8, h;  h=(b-a)/10;  for(double x=a; xlt;=b ;x =h){  coutlt;lt;"s(x)="lt;lt;s(x)lt;lt;endl;  }  return 0; }  

Извините за мой плохой английский!

Комментарии:

1. Не связан, но math.h является заголовком C, который, строго говоря, не существует в C . Эквивалентным заголовком C является cmath .

2. @Brian — строго говоря, заголовки C существуют в C . Всегда так было и всегда будет. Да, людям обычно следует использовать cxxx версии, но версии C работают просто отлично, если вы не возражаете против загрязнения глобального пространства имен.

3. @PeteBecker Ах, значит, ты прав. Они существуют как устаревшая функция под заголовками [depr.c.]. Спасибо за исправление!

Ответ №1:

Вы получаете переполнение целого числа со знаком f=k*f; , поэтому я предлагаю вам сделать f double :

 double s(double x){  double f = 1; // double  long double anw=1;  for(int k=1;klt;=100;k  ){  f = k * f; // or else you get a signed integer overflow here  // f *= k; // a simpler way of writing the above  anw=((pow((x-1),k)*pow(log(3),k))/f) anw;  }  return anw; }  

Еще одно примечание: Включите заголовок C cmath вместо заголовка math.h C.