Нужно объяснение о случайной функции Swift - PullRequest
3 голосов
/ 29 марта 2019

Возник вопрос о моей случайной функции: почему она выдает эту ошибку?

'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
}

это не меняет функциональность приложения, но просто появилось из ниоткуда.

спасибо заранее!

1 Ответ

7 голосов
/ 29 марта 2019

A IEEE 754 32-разрядное число с плавающей запятой число имеет 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.

Но с Swift4.2 вы можете полностью избежать этой проблемы, используя новый Random API :

func random(min: CGFloat, max: CGFloat) -> CGFloat {
    return CGFloat.random(in: min...max)
}
...