kos*_*tyl 7 floating-point ios floating-point-precision floating-point-conversion swift
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
Run Code Online (Sandbox Code Playgroud)
初始值是220904525.但是当我将它转换为浮动时它变为220904528.为什么?
Gre*_*reg 13
这是由于浮点格式的工作方式.阿Float
是一个32位浮点数存储在IEEE 754格式,这基本上是科学记数法,具有一些比特被分配给值,并且一些对指数(在基数为2),如从该图中的单精确浮点数维基百科文章显示:
所以实际数字表示为
(sign) * (value) * (2 ^ (exponent))
Run Code Online (Sandbox Code Playgroud)
因为分配给实际存储整数值(24)的比特数小于在普通整数(全部32)中为此分配的比特数,为了给指数腾出空间,大数字的较低有效位数将被牺牲,以换取表示几乎无限数的能力(法线Int
只能表示-2 ^ 31到2 ^ 31-1范围内的整数).
一些粗略测试表明,直到16777216(2 ^ 24)的每个整数都可以精确地表示在32位浮点数中,而较大的整数将四舍五入到最接近的2的幂次数.
请注意,这不是Swift特有的.这种浮点格式是几乎所有编程语言中使用的标准格式.这是我使用普通C从LLDB获得的输出:
如果您需要更高的精度,请使用Double
.双精度浮点数使用64位内存,具有更高的精度.
归档时间: |
|
查看次数: |
2595 次 |
最近记录: |