gpt4 book ai didi

swift 与 double 的步伐是不可靠的

转载 作者:行者123 更新时间:2023-11-28 07:30:58 24 4
gpt4 key购买 nike

在 Swift 4 中使用 stride 有时会导致错误的结果,这段代码证明了这一点:

import UIKit
import PlaygroundSupport
struct Demo {
let omegaMax = 10.0
let omegaC = 1.0
var omegaSignal:Double {get {return 0.1 * omegaC}}
var dOmega:Double {get {return 0.1 * omegaSignal}}
var omegaArray:[Double] {get {return Array(stride(from: 0.0, through: omegaMax, by: dOmega))}}

预计变量 dOmega 的值为 0.001。该数组预计具有 1001 个元素的大小,最后一个元素的值应为 10.0

但是,正如您在以下代码部分中看到的那样,这些假设是不正确的:

let demo = Demo()
let nbrOfElements = demo.omegaArray.count
let lastElement = demo.omegaArray[nbrOfElements-1]

print("\(nbrOfElements)") // -> 1000
print("\(lastElement)") // -> 9.990000000000002

那里发生了什么?检查 dOmega 给出了答案。

print("\(demo.dOmega)")   // -> 0.010000000000000002

增量值 dOmega 并不像预期的那样正好是 0.01,而是有一个非常小的近似误差,这对于 Double 来说是可以接受的。然而,这会导致预期的数组元素 1001 的值为 10.000000000000002,它大于给定的最大值 10.0,因此不会生成此元素 1001。根据步幅函数中的变量是否有舍入误差,结果是否符合预期。

我的问题是:使用 stride 和 Doubles 以在任何情况下获得预期结果的正确方法是什么?

最佳答案

您使用了错误的 stride 重载!

有两个重载:

您应该使用第二个,因为它包含参数through,而第一个不包含参数to

print(Array(stride(from: 0, through: 10.0, by: 0.001)).last!) // 10.0

您看到的微小差异只是因为 imprecise nature of Double .

关于 swift 与 double 的步伐是不可靠的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com