Преступник здесь Интегральное деление в C ++.
Если один из операндов является целым числом, C ++ выполняет интегральное деление, которое по своей природе отбрасывает дробную часть . Если хотя бы один из них является float или double, результат сохраняется. Например, проверьте вывод следующих операторов:
cout<<(1/5); // Gives 0 Umm.. weird
cout<<(1/5.0); // Gives 0.2 Umm.. works
cout<<(1.0/5) // Gives 0.2 Umm.. also works
Теперь в вашем коде измените:
sum = sum + 1/fact(i);
на
sum = sum + 1/(1.f*fact(i));
или typecast явно, по крайней мере, один из операндов .
sum += 1/(float)(fact(i));
Также обратите внимание, что:
(float)(1/5)
не будет работать, так как приведение типов происходит после целочисленного деления, поэтому убедитесь, что в по крайней мере один из операндов - это число с плавающей запятой или двойное число перед делением.
Вы можете узнать больше о том, как работает интегральное деление в C ++.
Полный рабочий код для справки:
#include <iostream>
#include <iomanip> //for precision
using namespace std;
int fact(int x){
if(x == 0 || x == 1)
return 1;
else
return x * fact(x-1);
}
int main(){
int n;
float sum=0;
//to set precision upto 3 decimal places
cout << std::fixed;
cout << std::setprecision(3);
cout<<"Enter number of terms: ";
cin>>n;
for(int i=1;i<=n;i++){
sum = sum + 1/(1.f*fact(i));
//sum += 1/(float)(fact(i)); or use typecasting like this
}
cout<<"The sum is :"<<sum<<endl;
return 0;
}
Чтобы узнать больше о настройке точности проверки это .