При портировании приложения с Linux x86 на iOS ARM (iPhone 4) я обнаружил разницу в поведении арифметики с плавающей запятой и малых значений.
64-разрядные числа с плавающей запятой (двойные) меньше чем [+/-] 2.2250738585072014E-308 называются денормальными / денормализованными / субнормальными числами в IEEE 754-1985 / IEEE 754-2008 standard.
На iPhone 4 такие небольшие числа рассматриваются как ноль (0), в то время как на x86 для вычисления могут использоваться субнормальные числа.
Я не смог найти ни одногообъяснение соответствия стандартам IEEE-754 в документации Apple Страница руководства Mac OS X Для float (3) .
Но благодаря некоторым ответам о переполнении стека ( flush-to-Нулевое поведение в арифметике с плавающей точкой , Двойное против поплавка на iPhone ), я нашел некоторые подсказки.
Согласно некоторым поискам, кажется, VFP (или NEON ) математический сопроцессор used вдоль ядра ARM использует режим Flush-To-Zero (FTZ) (например, субнормальные значения преобразуются в 0 на выходе) и режим Denormals-Are-Zero (DAZ) (например, субнормальные значения преобразуются в 0 при использовании в качестве входапараметры), чтобы обеспечить быстрые аппаратные вычисления IEEE 754.
- Полное соответствие IEEE754 с кодом поддержки ARM
- Режим Run-Fast для почти полного соответствия IEEE754 (только аппаратное обеспечение)
Хорошее объяснение FTZ и DAZ можно найти в x87 и SSE с плавающей запятой в IA-32: Flush-to-Zero (FTZ) и Denormals-Are-Zero (DAZ) :
Режимы FTZ и DAZ обрабатывают случаи, когда возникают недопустимые данные с плавающей запятой или обрабатываются в условиях недостаточного или ненормального состояния.[...].Разница между числом, которое обрабатывается FTZ и DAZ, очень тонкая.FTZ обрабатывает условия переполнения, в то время как DAZ обрабатывает ненормальные.Условие недостаточного потока возникает, когда вычисление приводит к денормализации.В этом случае режим FTZ устанавливает выходной сигнал на ноль.DAZ исправляет случаи, когда денормалы используются в качестве входных данных, либо в качестве констант, либо путем считывания недействительной памяти в регистры.Режим DAZ устанавливает входы вычисления в ноль перед вычислением.Тогда можно сказать, что FTZ обрабатывает [вывод], тогда как DAZ обрабатывает [ввод].
Единственное, что можно сказать о FTZ на сайте разработчиков Apple, - это Руководство по вызову функции iOS ABI :
Регистр состояния VFP |FPSCR |Специальный |Биты кода состояния (28-31) и биты насыщения (0-4) не сохраняются при вызове функции.Управление исключениями (8-12), режим округления (22-23) и биты сбрасывать до нуля (24) должны изменяться только конкретными подпрограммами, которые влияют на состояние приложения (включая функции API-интерфейса),Биты короткой векторной длины (16-18) и шага (20-21) должны быть равны нулю при входе и выходе из функции.Все остальные биты не должны быть изменены.
Согласно Техническому справочному руководству ARM1176JZF-S, 18.5 Режимы работы (первый процессор iPhone), VFP можно настроить для полной поддержкиIEEE 754 (не нормальная арифметика), но в этом случае потребуется некоторая программная поддержка (перехват в ядре для вычислений в программном обеспечении).
Примечание: я также прочитал ARM Hard Float Port Debian и Сравнение VFP страниц.
Мои вопросы:
Где можно найти окончательные ответы относительно обработки ненормальных чисел на устройствах iOS?
Можно ли настроить систему iOS на поддержку субнормальных чисел, не прося компилятор выдавать только полный программный код с плавающей запятой?
Спасибо.