ARM NEON конвертировать F32 в S32 с круглой к четной

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

Благодарю.

1 ответ

Нет, вы не можете изменить режим округления.

NEON предназначен для производительности, а не для точности, и, следовательно, ограничен по сравнению с VFP. В отличие от VFP, это не полная реализация IEEE 754, и она жестко привязана к определенным настройкам - цитата из ARM ARM:

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

Конкретный случай преобразования с плавающей точкой в ​​целое немного отличается тем, что поведение VCVT Инструкция в этом случае (для VFP и NEON) - игнорировать выбранный режим округления и всегда округлять до нуля. VCVTR Инструкция, которая использует выбранный режим округления, доступна только в VFP.

Архитектура ARMv8 представила целый набор инструкций по округлению и преобразованию для использования определенных режимов округления, но я подозреваю, что в данном конкретном случае это не сильно поможет. Если вы хотите выполнять преобразования в другом режиме округления в ARMv7 и более ранних версиях, вам придется либо использовать VFP (если доступно), либо использовать какой-нибудь битовый хакер для его реализации вручную.

* ARM ARM использует терминологию IEEE 754-1985, так что более точно это округление до ближайшего, связывание с четным

Другие вопросы по тегам