2015-07-19 2 views
0

Этот код вычисляет 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 

Поскольку он выходит из диапазона целого числа, поэтому я использую двойной/длинный двойной.

Но проблема в том, что я получаю разные выходные данные для двойного и длинного двойных, в то время как ни одно из промежуточных значений не имеет нулевой цифры после десятичной точки, поэтому, похоже, не должно быть округления.

+0

Вы должны изучить, что означает «плавающая точка». – melpomene

+0

У вас, похоже, есть фундаментальное недоразумение в отношении обоих этих типов данных. Считаете ли вы, что оба они имеют неограниченное количество целых цифр и отличаются только количеством «десятичных знаков», которые они могут представлять? Какую книгу вы используете? –

+1

http://floating-point-gui.de/ –

ответ

1

, хотя никакие промежуточные значения не имеют нулевой цифры после десятичной точки, поэтому, похоже, не должно быть округления.

Это предположение просто неверно. Все числа с плавающей точкой, как double и т.д., хранятся как

mantissa * 2^exponent 

с конечным числом битов, как для мантиссы и экспоненты. Таким образом, числа с плавающей запятой могут хранить фиксированное количество значимых цифр (для double, преобразованных в десятичное представление, обычно около 16). Если число больше цифр до десятичной точки, округление произойдет, и общая ошибка округления станет больше, чем больше цифр, которые нужно «забыть».

Если вы хотите получить более подробную информацию об этом, наиболее распространенные реализации с плавающей точкой следуют за IEEE floating point standard.