-2

我不知道我的泰勒级数代码有什么问题:

func factorial(n: Int) -> Int {
    return n == 0 ? 1 : n * factorial(n - 1)
}

func sin(num: Float) -> Float {
    let rad : Float = num * 1.0 / 180.0 * 3.1415926535897;
    var sum : Float = rad;
    for i in 1...100 {
        if (i % 2 == 0) {
            sum += Float(pow(rad, 2 * i + 1) / Float(factorial(2 * i + 1)));
        } else {
            sum -= Float(pow(rad, 2 * i + 1)) / Float(factorial(2 * i + 1));
        }
    }
    return sum;
}

print(sin(123.0));

以下是错误:

<stdin>:11:17: error: cannot invoke '/' with an argument list of type '(@lvalue Float, $T25)'
sum += Float(pow(rad, 2 * i + 1) / Float(factorial(2 * i + 1)));
~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<stdin>:13:13: error: 'Float' is not identical to 'UInt8'
sum -= Float(pow(rad, 2 * i + 1)) / Float(factorial(2 * i + 1));
^
4

3 回答 3

1

pow函数需要两个相同类型的参数,要么 要么FloatDouble除法也是如此。

sum +/-=...将您的陈述更改为:

if (i % 2 == 0) {
  sum += pow(rad, Float(2 * i + 1)) / Float(factorial(2 * i + 1))
} else {
  sum -= pow(rad, Float(2 * i + 1)) / Float(factorial(2 * i + 1))
}
于 2015-01-15T02:50:39.487 回答
0

你需要同时处理整数和浮点数吗?Swift对类型真的很挑剔,所以如果你能坚持一个,那会让你的生活变得更轻松。仅使用浮点数,您可以通过添加一行来完成此工作:

func factorial(n: Float) -> Float {
    return n == 0 ? 1 : n * factorial(n - 1)
}

func sin(num: Float) -> Float {
    let rad : Float = num * 1.0 / 180.0 * 3.1415926535897;
    var sum : Float = rad;
    for i in 1...100 {
        let float_index :Float = Float(i) 
        if (i % 2 == 0) {
            sum += Float(pow(rad, 2 * float_index + 1) / Float(factorial(2 * float_index + 1)));
        } else {
            sum -= Float(pow(rad, 2 * float_index + 1)) / Float(factorial(2 * float_index + 1));
        }
    }
    return sum;
}
于 2015-01-15T02:50:10.610 回答
0

我认为pow要求它的论点是相同的类型,但即使你解决了这个问题,你所拥有的也不会起作用。那是因为您的factorial函数正在生成太大的数字。

最大的 64 位整数大约有 20 位,而 200 的阶乘大约有 375。

因此,它不适合 a Int,甚至不适合 a Double(双精度 IEEE754 数字),最大约 308 位(上限,显然精度较低)。

您需要向上移动到Float80提供数千位数范围的位置。

但是,同样,由于精度有限,您可能会在计算中引入很多错误。即使使用 IEEE754四倍精度(仅限于大约 34 位十进制精度)也是如此。

于 2015-01-15T02:51:51.110 回答