EXC_BAD_INSTRUCTION code = EXC_I386_INVOP для функции подсчета Фибоначчи - PullRequest
0 голосов
/ 05 мая 2018

Я очень новичок в Swift (и нединамических типизированных языках) и пытаюсь создать функцию, которая создаст массив из первых 100 чисел Фибоначчи.

Вот оно:

func buildFibonacci(){
    var numbers: [Int64] = [0,1]
    for x in (2...99) {    
        numbers.append(numbers[x-1] + numbers[x-2])
    }
    print(numbers)
}

buildFibonacci()

Но когда я запускаю его, на 93-й итерации я получаю ошибку: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0). Насколько я понимаю, это поднимается на сумму операции.

Полагаю, это размер Int, поэтому я изменил его на Int64, но похоже, что проблема была в другом. Я использую swift 4.1, если это важно. Может ли кто-нибудь помочь мне?

1 Ответ

0 голосов
/ 05 мая 2018

Ваше предположение верно, это исключение переполнения, число становится слишком большим, чтобы быть представленным в 64 битах. На 64-битных машинах Int равно Int64, поэтому смена типа не имеет значения.

Решение состоит в том, чтобы использовать NSDecimalNumber, который не ограничен 64-битным и предоставляет основные арифметические методы.

func buildFibonacci(){
    var numbers: [NSDecimalNumber] = [.zero, .one]
    for x in 2...99 {
        numbers.append(numbers[x-1].adding(numbers[x-2]))
    }
    print(numbers)
}

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