5.1 Проблемы целочисленной арифметики
Рассмотрим пример вычисления чисел
Фибоначчи, которые вычисляются по
следующей формуле:

Рис1.
Очевидно,что все числа Фибоначчи
целые неотрицательные числа. Вот первые
несколько чисел: 1,1,2,3,5,8,13,21,34,55,89,144,233,377 ... В пояснении представлена программа
для вычисленя.
- Макроопределение NUMBER - задает тип
целого в Си это (char -1 байт, short -2 байта,int -4 байта,long -4 байта,int64
-8 байт).
Макроопределение FORMAT -описывает
формат вывода в функции printf (дл целыхтиповchar,short,int,long -"%d",дл
int64-"%Ld").
Функци Fibo(n)возвращает вычисленное
число по номеру n.
Рассмотрим теперь проблемы
вычисления, использу различные типы целых, определенных в Си. Подставляя различные типы в
макроопределение NUMBER
и соответствующий формат в
макроопределение FORMAT. Попытаемся вычислить число Fibo(100), мы обнаружим, что
наступает момент, когда два предыдущих значения положительные, а результат
отрицательный. Это означает, что происходит переполнение. Этот факт говорит о
том, что нужно внимательно выбирать тип представлени целого числа.
- #define NUMBER int;
#define FORMAT "%d;\n";
NUMBER Fibo(int n)
{
NUMBER i1, i2, f;
int
j;
if(n<2)
return 1;
i1=1;
i2=1;
for(j=2;
j<n; j++)
{
f=i1+i2;
i1=i2;
i2=f;
printf( FORMAT, f);
}
return
f;
}
void main()
{
printf("размер целого типа %d \n",sizeof(NUMBER));
printf(FORMAT,Fibo(100));
}
Другой простой пример: необходимо
подсчитать количество дней между двум датами, при это логично
предложить 16 разр дное представление целого числа. Однако, если это число будет
знаковое, то максимальное значение 2^15 - 1 = 32767, и если, например, разность будет
равна 100 лет то приблизительное значение будет равно 100*365=36500, отсюда
при вычислении такой разности произойдет переполнение.
|