有一个关于我的随机函数的问题:为什么会出现此错误?
'4294967295' is not exactly representable as 'Float'; it becomes '4294967296'
-
我的代码是
func random() ->CGFloat {
return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func random(min: CGFloat, max: CGFloat) -> CGFloat {
return random() * (max - min) + min
}
它不会改变应用程序的功能,但它似乎无处不在。
提前谢谢!
答案 0 :(得分:7)
IEEE 754 32-bit floating point数字的尾数有24个有效位,不足以精确存储10位整数:
print(0xFFFFFFFF) // 4294967295
print(Float(0xFFFFFFFF)) // 4.2949673e+09
print(Int(Float(0xFFFFFFFF))) // 4294967296
那不会影响您的代码,因为
Float(arc4random()) / Float(0xFFFFFFFF)
仍然是0.0到1.0之间的浮点数。将计算更改为
return CGFloat(arc4random()) / 0xFFFFFFFF
将在64位平台上修复该警告:整数常量现已转换为(64位)Double
。
但是从Swift 4.2开始,您可以使用新的Random
API来完全避免该问题:
func random(min: CGFloat, max: CGFloat) -> CGFloat {
return CGFloat.random(in: min...max)
}