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, так что более точно это округление до ближайшего, связывание с четным