swift4 - EXC_BAD_INSTRUCTION code=EXC_I386_INVOP 斐波那契计数函数
问题描述
我是 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。有人可以帮我吗?
解决方案
您的假设是正确的,这是一个溢出异常,数字变得太高而无法用 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()
推荐阅读
- java - 如何使用 Java 程序跳过 MySql 数据库中的前 n 行?
- ballerina - Ballerina-Composer 可以与 Ballerina V 1.0 一起使用吗?
- ubuntu - 如何在 Ubuntu 服务器 18.04(在树莓派上)上建立网桥 ethernet-wlan?
- java - 如何在本地导入库而不在 Maven 中使用 Nexus?
- javascript - 如何知道服务器端是否加载了 JS 文件?
- three.js - Three.js 隐藏径向线段
- r - R data.table 用下一个非缺失值替换缺失值
- sql - 基于从 Oracle SQL 中的 ALL_TABLES 中选择递归更新表行
- docker - docker的多个DNS
- python - 聚合列组