2014-10-18 6 views
0

У меня есть несколько вопросов, касающихся с плавающей запятой и устройств iOS:

Являются ли детерминированные значения на одном устройстве iOS плавающими точками?
Являются ли плавающие точки детерминированными для всех устройств iOS?Являются ли детерминированные точки с плавающей запятой устройствами iOS?

Если нет, есть ли способ сделать их детерминированными? Я имею в виду следующее: изменение настроек компилятора, использование сокращенного набора математических операций и т. Д.

Если нет никакого способа сделать это, какова была бы лучшая альтернатива?
Вместо этого я могу использовать фиксированные точки? Это будет означать использование NSDecimalNumber?

Cheers.

+0

Можете уточнить, что вы подразумеваете под детерминистическим? Какая у вас проблема? Обратите внимание, что параметры компилятора будут влиять на соответствие плавающей запятой IEEE, поэтому вам нужно будет проверить настройки Xcode, чтобы гарантировать, что при компиляции установлены правильные флаги. –

+0

Я хочу, чтобы мой код был детерминированным. Я хочу, чтобы операция вернула float, чтобы вернуть то же самое значение для разных os и устройств. Меня не волнует точность результата, он просто должен быть стабильным. http://randomascii.wordpress.com/2013/07/16/floating-point-determinism/ –

+1

Учитывая те же самые входы (включая системные настройки), вы получите одинаковые выходы для любой операции с поплавком IEEE. Для iOS вы рискуете только разницей между версиями iOS, которые имеют разные значения размера для целочисленных типов, и это может произойти только в случае переполнения (т. Е. Ошибки) с меньшими значениями. –

ответ

1

Результаты одного и того же размера данных должны быть идентичными. Стандарт IEEE для плавающей запятой диктует результаты для разных операций с плавающей запятой для разных чисел чисел с плавающей запятой.

Если у вас могут возникнуть проблемы, если определение разных типов данных зависит от разных архитектур.

Размер «float» формально не определен в ANSI C. Он может быть 4 байта на некоторых платформах и 8 на других. (Например, NSInteger - 32 бита на 32-битном устройстве и 64 бита на 64-битном устройстве. Я знаю, что это целочисленный тип, но его пример типа, который изменяет размер на основе платформы.)

Я не знаю, изменила ли Apple размер любого из типов данных между их 32-битными и 64-разрядными платформами. Может быть, кто-то, кто знает окончательно, может перезвонить здесь.

Новейшие устройства iOS - 64 бит. Я бы предложил проверить размер float/CGFloat (используя sizeof().) Если у вас нет доступа к одному из 64-разрядных 64-разрядных устройств, вы можете проверить его с помощью 64-битного симулятора.

Это нравится

+0

Хорошая точка. Размер поплавка остался прежним: http://stackoverflow.com/questions/2107544/types-in-objective-c-on-iphone –

 Смежные вопросы

  • Нет связанных вопросов^_^