2013-03-03 2 views
0

Я сделал функцию, которая вычисляет факториала числа от 0 до 16 (нет отрицательного и достаточно маленький)C++ факториала с типом данных выдает

но это обыкновение идти мимо n15 любая идея, какой тип данных я должен использовать и где?

long factorial(long num1) 
{ 
    long f; 

    if (num1 >= 0 && num1 <= 16) 
    { 
     for (long i = 0; i <=num1; i++) 
     { 
      if (i==0) f = 1; 
      else f=f * i; 
     } 
     return f; 
    } 
    return 0xFFFFFFFF; 
} 
+3

Почему 'double'? Предполагается ли это, что это функция Гамма? – 2013-03-03 07:20:27

+0

исправлено. Сначала я тестировал двойники, а затем пошел к длинным, так как я получил более высокий – 2013-03-03 07:21:49

+0

'16!' Должен вписываться в 'long', поэтому тип данных в порядке. Что именно происходит при вводе '15' в функцию? – mgibsonbr

ответ

2

Я думаю, вы используете 32-битную систему, иначе это сработает.

Максимальное число, которое вы можете представить на 32 бита целое число, равно 2^31 (вам нужно сохранить бит для знака).

В зависимости от вашей архитектуры (на ваш вопрос нельзя ответить без этой информации), long может храниться на 32 битах, и поэтому вы не можете точно представлять 16! потому что он больше 2^31.

Ищите конкретное расширение вашего компилятора/архитектуры, чтобы гарантировать, что у вас есть 64-битная память (это не гарантируется стандартом, который не определяет, сколько бит должны иметь типы, он просто устанавливает неравенство между типами размера хранилища).

+0

Похоже, что реальный прогресс заключается в том, что им пришлось использовать двойные в основном. – 2013-03-03 07:24:08

+0

Проблема, которую я вижу, это то, что 15! составляет более одного триллиона, так как это работает? – chris

+2

С C++ 11 вы можете использовать 'long long int', который должен иметь не менее 64 бит. [Источник] (http://en.wikipedia.org/wiki/C%2B%2B11#Type_long_long_int) – Mic

1

Изменение long в long long:

long long factorial(long num1) 
{ 
    long long f; 
    //.... 
} 
+0

Это работало вместе с pluggin – 2013-03-03 07:47:08

0

Попробуйте посмотреть в библиотеке gmplib - должны позволяют хранить и использовать очень большое количество

Смежные вопросы