首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中浮点数的定点表示

Swift中浮点数的定点表示
EN

Stack Overflow用户
提问于 2015-11-18 18:43:20
回答 2查看 1.2K关注 0票数 1

我正在尝试在Swift中准确地表示浮点数。假设我们有一个数字let doubleNumber = 16.756。这样做的问题是,实际的数字类似于16.7560009。此外,在不同的手机上,例如,由于处理器不平等,它是16.7559991。定点运算应该是这类问题的答案,但我不知道如何在Swift中解决它。老实说,也不是用其他语言。那么如何在Swift中创建浮点数的定点表示呢?

我这样问的原因是,当跨设备精确模拟物理时,浮点数的微小差异可能会导致完全不同的物理模拟。

EN

回答 2

Stack Overflow用户

发布于 2015-11-18 22:09:49

您给出的数字表明您使用的是浮点数,而不是双精度数。Float只有大约6位的精度,Double有大约15位的精度。记住,CGFloat要么是Float,要么是Double,所以不要使用它。

Swift使用IEEE 754标准浮点运算。只要你始终如一地使用Double,不同的处理器之间应该没有任何区别。

现在到了一个非常关键的点:如果不同处理器上的浮点运算之间的细微差异产生了完全不同的模拟,那么这两个模拟都与现实无关,因此完全没有用。或者它们都显示了许多可能的结果中的一个,然后再说一次,您显示的是哪一个没有区别。

票数 5
EN

Stack Overflow用户

发布于 2015-11-19 00:03:05

有趣的实验

代码语言:javascript
复制
import Foundation

let f1: Float = 0x1p-149
f1.isZero                       // false
let f0: Float = 0x1p-150
f0.isZero                       // true   
Float(f1 / 2) == Float(f1 / 3)  // true ??? what ??? f1 is zero?

let d1 = 0x1p-1074
d1.isZero                       // false
let d0 = 0x1p-1075
d0.isZero                       // true
d1 / 2 == d1 / 3                // true

print("value of Float next to 0 is \(f1) or as Double \(Double(f1))")
print("value of Double next to 0 is \(d1)")

/*

value of Float next to 0 is 1.4013e-45 or as Double 1.40129846432482e-45
value of Double next to 0 is 4.94065645841247e-324

*/

我建议所有需要执行浮点计算的人使用What Every Computer Scientist Should Know About Floating-Point Arithmetic

一个适当的算法如何减少错误的例子

代码语言:javascript
复制
import Foundation

var arr: [Float] = []
for i in 0...100 {
    arr.append(Float(random()))
}

let sum1 = arr.reduce(0.0) { $0 + $1 }

var sum2 = arr[0]
var c:Float = 0.0
for j in 1..<arr.count {
    let y: Float = arr[j] - c
    let t: Float = sum2 + y
    c = t - sum2 - y
    sum2 = t
}
print(sum1, sum2, "and the 'small' difference is:", sum2 - sum1)
// 1.18466e+11 1.18466e+11 and the 'small' difference is: 8192.0

// what do you thing, which one is more precise ?
// sum1 or sum2 ????

// lets try the same with naive Double approach
let sum3 = arr.map{ Double($0) }.reduce(0.0) { $0 + $1 }
print(Double(sum1)-sum3)    // -11268.0
print(Double(sum2)-sum3)    // -3076.0
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33777897

复制
相关文章

相似问题

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