Этот код вычисляет N-й член ряда, который определяется как Tn + 2 = (Tn + 1)^2 + Tn, где 1-й и 2-й члены указаны как a и b в коде.Почему двойной и длинный двойные дают разные ответы в следующей программе
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a,b,n;
char ch[100];
cin>>a>>b>>n;
long double res[3];
res[0]=a,res[1]=b;
for(int i=n-2;i>0;i--)
{
res[2]=res[1]*res[1]+res[0];
res[0]=res[1];
res[1]=res[2];
}
sprintf(ch,"%.0Lf",res[2]);
cout<<ch;
return 0;
}
Входной сигнал: 0 1 10
Выход:
84266613096281242861568 // in case of double res[3];
84266613096281243385856 // in case of long double res[3];
correct output : 84266613096281243382112
Поскольку он выходит из диапазона целого числа, поэтому я использую двойной/длинный двойной.
Но проблема в том, что я получаю разные выходные данные для двойного и длинного двойных, в то время как ни одно из промежуточных значений не имеет нулевой цифры после десятичной точки, поэтому, похоже, не должно быть округления.
Вы должны изучить, что означает «плавающая точка». – melpomene
У вас, похоже, есть фундаментальное недоразумение в отношении обоих этих типов данных. Считаете ли вы, что оба они имеют неограниченное количество целых цифр и отличаются только количеством «десятичных знаков», которые они могут представлять? Какую книгу вы используете? –
http://floating-point-gui.de/ –