gpt4 book ai didi

ios - 在 Swift 中将 Int 转换为 Float 会丢失大数字的精度

转载 作者:搜寻专家 更新时间:2023-10-30 21:50:48 28 4
gpt4 key购买 nike

XCode 6.3.1 swift 1.2

let value: Int = 220904525
let intmax = Int.max
let float = Float(value) // Here is an error probably
let intFromFloat = Int(float)
let double = Double(value)
println("intmax=\(intmax) value=\(value) float=\(float) intFromFloat=\(intFromFloat) double=\(double)")
// intmax=9223372036854775807 value=220904525 float=2.20905e+08 intFromFloat=220904528 double=220904525.0

初始值为 220904525。但当我将其转换为 float 时,它变为 220904528。为什么?

最佳答案

这是由于浮点格式的工作方式。 Float 是一个 32 位 float ,存储在 IEEE 754 format 中,这基本上是科学计数法,一些位分配给值,一些分配给指数(以 2 为基数),如图 single-precision floating-point number Wikipedia article 中的图表显示:

32-bit float format

所以实际的数字表示为

(sign) * (value) * (2 ^ (exponent))

因为分配给实际存储一个整数值的位数(24)比普通整数(全部32)分配给这个的位数要少,为了给指数腾出空间,低位将牺牲大量数,以换取表示几乎无限数的能力(普通 Int 只能表示 -2^31 到 2^31 - 1 范围内的整数)。

一些粗略的测试表明,16777216(2 ^ 24)内的每个整数都可以准确表示为 32 位float,而较大的整数将四舍五入到最接近的 2 的某个幂的倍数。

请注意,这并非特定于 Swift。这种浮点格式是几乎所有编程语言都使用的标准格式。这是我使用普通 C 从 LLDB 获得的输出:

如果您需要更高的精度,请使用 Double。 double float 使用64位内存,精度更高。

关于ios - 在 Swift 中将 Int 转换为 Float 会丢失大数字的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260769/

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