Отрицательное значение возвращается, когда используются только положительные целые числа - PullRequest
1 голос
/ 05 декабря 2011

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

  public static int fib(int n)
    {
        int a = 0;
        int b = 1;
        for (int i = 0; i < n; i++)
        {
            int temp = a;
            a = b;
            b = temp + b;
        }

        return b;
    }

    static void Main(string[] args)
    {
        int n = 0;
        bool Run = true;

        while (Run == true)
        {
            n = fib(n + 1);
            Console.WriteLine(n);
        }
    }

Вот результаты при выполнении кода:

1
2
3
5
13
610
-121099088
1

Ответы [ 3 ]

12 голосов
/ 05 декабря 2011

Вы видите целочисленное переполнение.Вы пытаетесь вычислить fib(610), что намного больше, чем может вместить Int32 - и когда вы сложите вместе два больших целых числа, вы получите отрицательное число.

Если вы его встроите, "В проверенном режиме вместо этого будет выдано исключение - или вы можете сделать это только для одного нужного вам выражения:

for (int i = 0; i < n; i++)
{
    int temp = a;
    a = b;
    b = checked(temp + b);
}

Подробнее о проверенная арифметика .

см. в MSDN.
7 голосов
/ 05 декабря 2011

Это результат целочисленного переполнения и использования twos 'дополнения для представления целых чисел.

В C # по умолчанию не проверяется целочисленное переполнение.Если вы измените на checked контекст, вы получите исключение.

Либо используйте checked контекст, используйте uint или даже ulong - вам необходимо убедиться, что вы используете тип данных, который может содержать вычисляемые вами значения.

1 голос
/ 05 декабря 2011

Ваш код вычисляет n-е число Фибоначчи, но оно получает n из предыдущего расчета.Я предполагаю, что 610-е число Фибоначчи переполняется int.Используйте unsigned uint или ulong, если вы хотите продолжать использовать эту логику.В противном случае вам нужно изменить способ определения n для расчета Фибоначчи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...