.: [предыдущая | оглавление | следующая] :.

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, отсюда при вычислении такой разности произойдет переполнение.

.: [предыдущая | оглавление | следующая] :.