尝试在Swift Playground中打印功能时出现EXC_BAD_INSTRUCTION错误
问题描述:
我目前正在研究一个大学数学项目,该项目要求我创建与抵押贷款有关的应用程序。我试图编写Swift代码来计算抵押贷款每月支付的本金和利息。尝试在Swift Playground中打印功能时出现EXC_BAD_INSTRUCTION错误
我写的代码如下(值得一提的我很新用与Python的一点经验的编码,这都是自学的,所以任何批评是值得欢迎的!):
// Declare all variables
// y = periodic interest rate
// n = time left of repayment period (months)
let y = [Float](arrayLiteral: 0.02/12,0.03/12,0.04/12,0.05/12)
let n = [Float](arrayLiteral: 240,180,120,60)
var x = [Float]()
var interest = [Float]()
var T_1 = [Int]()
// Create Array from 0 to 240
for a in 0...240 {
T_1.append(a)
}
// Create Array of all 240 interest values
for a in 0...239 {
if a < 60 {
interest.append(y[0])
var repay = n[0]
x.append(repay)
}
else if a < 120 {
interest.append(y[1])
var repay = n[1]
x.append(repay)
}
else if a < 180 {
interest.append(y[2])
var repay = n[2]
x.append(repay)
}
else {
interest.append(y[3])
var repay = n[3]
x.append(repay)
}
}
print("Interest array:",interest)
// Calculate Each months Principal paid and Interest Paid
func variablerate(P: inout Float) -> [Float] {
var principal = [Float]()
var i_paid = [Float]()
var repayments = [Float]()
var R = Float(0)
let temporaryP = P
i_paid.append(0)
for a in 0...240 {
if (a>0) && (a<240) && (interest[a-1] == interest[a]) {
let ip = P*(1+interest[a-1])-P
i_paid.append(i_paid[a-1] + ip)
P = (1+interest[a-1])*temporaryP
P = P-R
let h = interest[a]
R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
repayments.append(R)
principal.append(round(100*P)/100)
}
else if a==240 || a==241 {
P = P - R
principal.append(round(100*P)/100)
let ip = P*(1+interest[a-1])-P
i_paid.append(i_paid[a-1] + ip)
let h = interest[a-1]
P = P*(1+h)
}
else {
P = P - R
let h = interest[a]
R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
repayments.append(R)
principal.append(round(100*P)/100)
let ip = P*(1+interest[a])-P
i_paid.append(i_paid[a-1] + ip)
P = P*(1+h)
}
}
return i_paid
return principal
}
var z = Float(100000)
print(variablerate(P: &z)) //This is where the error appears
的给定的错误是:
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode=0x0).
在这个问题上的任何帮助或指导,将大规模感激!
答
坠机原因是指数超出范围。
你越来越指数超出范围的异常,因为在代码中,你正在运行一个循环从0到240,并从局部变量一个在第一次迭代一个减去1,因此将包含0和0减去1将给予负面指数。
这里是错误
要在0 ... 240 {
如果(a> 0时)& &(一个< 240)& &(兴趣[A-1] ==兴趣并[a])
下面码与校正
// Declare all variables
// y = periodic interest rate
// n = time left of repayment period (months)
let y = [Float](arrayLiteral: 0.02/12,0.03/12,0.04/12,0.05/12)
let n = [Float](arrayLiteral: 240,180,120,60)
var x = [Float]()
var interest = [Float]()
var T_1 = [Int]()
// Create Array from 0 to 240
for a in 0...240 {
T_1.append(a)
}
// Create Array of all 240 interest values
for a in 0...239 {
if a < 60 {
interest.append(y[0])
var repay = n[0]
x.append(repay)
}
else if a < 120 {
interest.append(y[1])
var repay = n[1]
x.append(repay)
}
else if a < 180 {
interest.append(y[2])
var repay = n[2]
x.append(repay)
}
else {
interest.append(y[3])
var repay = n[3]
x.append(repay)
}
}
print("Interest array:",interest)
// Calculate Each months Principal paid and Interest Paid
func variablerate(P: inout Float) -> [Float] {
var principal = [Float]()
var i_paid = [Float]()
var repayments = [Float]()
var R = Float(0)
let temporaryP = P
i_paid.append(0)
for a in 1...240 { // Code corrected now loop go from 1 to 240
if (a>0) && (a<240) && (interest[a-1] == interest[a]) {
let ip = P*(1+interest[a-1])-P
i_paid.append(i_paid[a-1] + ip)
P = (1+interest[a-1])*temporaryP
P = P-R
let h = interest[a]
R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
repayments.append(R)
principal.append(round(100*P)/100)
}
else if a == 240 || a == 241 {
P = P - R
principal.append(round(100*P)/100)
let ip = P*(1+interest[a-1])-P
i_paid.append(i_paid[a-1] + ip)
let h = interest[a-1]
P = P*(1+h)
}
else {
P = P - R
let h = interest[a]
R = (P*h)/(1-pow(1+h,Float(interest.count-a)))
repayments.append(R)
principal.append(round(100*P)/100)
let ip = P*(1+interest[a])-P
i_paid.append(i_paid[a-1] + ip)
P = P*(1+h)
}
}
//return i_paid
return principal
}
var z = Float(100000)
print("\(variablerate(P: &z))")
+0
感谢Sunil,按照我的希望工作! –
我在此之前收到错误,例如未解析的标识符'pow'? – dylan
@dylan我的Swift游乐场上没有其他错误出现。 pow(double,double)已被用于使用幂的表达式。 –
当'a'为零时,在'i_paid.append(i_paid [a-1] + ip)'时,在编译的项目中运行您的代码会导致“致命错误:索引超出范围”... –