субнормальная поддержка чисел с плавающей запятой IEEE 754 на устройствах iOS ARM (iPhone 4)

При переносе приложения с Linux x86 на iOS ARM (iPhone 4) я обнаружил разницу в поведении арифметики с плавающей запятой и малых значений.

64-битные числа с плавающей запятой (double) , меньшие, чем [+/-] 2.2250738585072014E-308, называются денормальными / денормализованными / субнормальными числами в IEEE 754-1985 / Стандарты IEEE 754-2008 .

На iPhone 4 такие маленькие числа обрабатываются как ноль (0), тогда как на x86 для вычислений можно использовать субнормальные числа.

Мне не удалось найти никаких объяснений относительно соответствия стандартам IEEE-754 в документации Apple Страница руководства Mac OS X для float (3) .

Но благодаря некоторым ответам на тему переполнения стека ( сброс до нуля в арифметике с плавающей запятой , Двойное против плавающего на iPhone ) я нашел некоторые подсказки.

По некоторым данным, математический сопроцессор VFP (или NEON ), используемый в ядре 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 обрабатывают случаи, когда возникают недопустимые данные с плавающей запятой или { {1}} обработано с недополнением или ненормальными условиями. [...]. Разница между числом , обрабатываемым FTZ и DAZ, очень тонкая. FTZ обрабатывает условия недостаточного заполнения, в то время как DAZ обрабатывает ненормальные значения. Состояние потери значимости возникает, когда вычисление приводит к ненормированному значению . В этом случае режим FTZ устанавливает выход на ноль. DAZ исправляет случаи, когда денормальные значения используются в качестве входных данных либо как константы, либо путем чтения недопустимой памяти в регистры . В режиме DAZ перед вычислением входные данные вычисления обнуляются. Тогда можно сказать, что FTZ обрабатывает [вывод], а DAZ обрабатывает [ввод].

Единственное, что касается FTZ на сайте разработчиков Apple, похоже, можно найти в Руководстве по вызову функций iOS ABI :

Регистр состояния VFP | FPSCR | Special | Биты кода условия (28–31) и биты насыщения (0–4) не сохраняются при вызовах функций. Управление исключениями (8-12), режим округления (22-23) и сброса до нуля (24) биты должны изменяться только с помощью определенных подпрограмм, которые влияют на состояние приложения (включая функции API платформы) . Биты длины короткого вектора (16-18) и шага (20-21) должны быть равны нулю при входе в функцию и выходе из нее. Все остальные биты изменять нельзя.

Согласно Техническое справочное руководство ARM1176JZF-S, 18.5 Режимы работы (первый процессор iPhone), VFP можно настроить для полной поддержки IEEE 754 (субнормальная арифметика), но в этом случае потребуется некоторая программная поддержка (захват ядра для вычислений в программном обеспечении).

Примечание: я также читал страницы Debian ARM Hard Float Port и Сравнение VFP .

Мои вопросы:

  • Где можно найти окончательные ответы относительно обработки субнормальных чисел на устройствах iOS?

  • Можно ли настроить систему iOS на поддержку субнормальных чисел, не требуя от компилятора создания только полностью программного обеспечения с плавающей запятой код?

Спасибо.

11
задан Community 23 May 2017 в 11:45
поделиться