首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:执行被中断,原因: EXC_BAD_INSTRUCTION错误

Swift:执行被中断,原因: EXC_BAD_INSTRUCTION错误
EN

Stack Overflow用户
提问于 2016-10-16 14:27:11
回答 1查看 893关注 0票数 0

当我在游乐场尝试这样做时:

代码语言:javascript
复制
func StockEvolution(S_0:Double, _ down:Double, _ up:Double, _ totalsteps:Int, _ upsteps:Int) -> Double // function being used in calcCall()
{
    var S_t:Double = S_0 * pow(up, Double(upsteps)) * pow(down, Double(totalsteps - upsteps))
    return S_t 
}

func CallPayoff(S:Double, _ K:Double) -> Double // function being used in calcCall()
{
    return max(S - K, 0.0)
}

func calcCall(S_0:Double, _ down:Double, _ up:Double, _ r:Double, _ steps:Int, _ K:Double) -> Double //calculate Call-Option
{
    var prices = [Double]()
    var q = 0.6 //risk-neutral probability factor

var i = 0
while i < steps
{
    var payOff = CallPayoff(StockEvolution(S_0, down, up, steps, i), K)
    prices.append(payOff)
    i += 1
}

var n = steps - 1
while n >= 0
{
    var j = 0
    while j <= n
    {
        var value = (1 / r) * (prices[j + 1] * q + (1 - q) * prices[j])
        prices.removeAtIndex(j)
        prices.insert(value, atIndex: j)
        j += 1
    }
    n -= 1
}
return prices[0]
}

通过这样做:

代码语言:javascript
复制
var checkPrice = calcCall(100, 0.6, 1.5, 1.05, 10, 200)

它给了我这个错误:

执行被中断,原因: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode=0x0)

我似乎在我的代码中找不到bug。我尝试使用不同的输入值,但错误仍然发生。

如果您能够查看我的代码并帮助我解决这个问题,那就太好了。谢谢你的努力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-16 15:34:32

问题在于嵌套的while循环。第一次循环时,n设置为9,这意味着在最后一次遍历嵌套循环时,您将得到j == 9,这显然意味着j + 1 == 10。但你想得到的是prices[j + 1] == prices[10],它并不存在。所以坠毁了。

要查看这一点,请添加以下if语句:

代码语言:javascript
复制
if j + 1 < prices.count {
    let value = (1 / r) * (prices[j + 1] * q + (1 - q) * prices[j])
    prices.removeAtIndex(j)
    prices.insert(value, atIndex: j)
}
j += 1

您将不再得到错误的访问错误。

现在,我根本不知道问题域,所以我不能说为什么您的算法是不正确的。因此,我所提供的答案可能无法给出您所期望的值。您可能需要弄清楚为什么要访问一个不存在的索引,以及如何解决这个问题。

最后,如果可以的话,我要说的是一些一般的风格要点:

  • 您可能会注意到,我将上面代码示例中的var替换为let。由于value从未发生变异(相反,每次通过循环都要重新定义),所以它不需要是可变的。删除可变状态将使您更容易在代码中找到问题。
  • 您使用了许多具有可变状态的while循环来跟踪它们的进度。这些都可以用for...in循环代替。例如,可以用for i in 0..<steps替换第一个时间,而不影响代码。这再次有助于减少可变状态和程序员错误。

我冒昧地重写了您的代码,使其更加“迅速”,同时也尽可能地删除了可变的状态。下面是:

代码语言:javascript
复制
func stockEvolution(s_0: Double, _ down: Double, _ up: Double, _ totalsteps: Int, _ upsteps: Int) -> Double {
    let s_t: Double = s_0 * pow(up,  Double(upsteps)) * pow(down,  Double(totalsteps - upsteps))
    return s_t
}

func callPayoff(s: Double, _ k: Double) -> Double {
    return max(s - k, 0.0)
}

func calcCall(s_0: Double, _ down: Double, _ up: Double, _ r: Double, _ steps:Int, _ k: Double) -> Double {
    var prices = Array(0..<steps).map { step in
        return callPayoff(stockEvolution(s_0, down, up, steps, step), k)
    }
    let q = 0.6 //risk-neutral probability factor

    for n in (0..<steps).reverse() {
        for j in 0...n where j + 1 < prices.count {
            let value = (1 / r) * (prices[j + 1] * q + (1 - q) * prices[j])
            prices.removeAtIndex(j)
            prices.insert(value, atIndex: j)
        }
    }
    return prices[0]
}

let checkPrice = calcCall(100, 0.6, 1.5, 1.05, 10, 200)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40071400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档