Как проверить соотношение числа (с плавающей точкой - ARM)? - PullRequest
0 голосов
/ 09 июня 2019

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

Я пытался использовать VTST.F32 S0, # 1.0, потому что я буду работать с плавающей точкой, так как я использую TST R0, # 1 p.ex, когда я использую регистры Rn. Это тоже инструкция для FP, или я должен использовать другую инструкцию?

FP - Fatorial.s (111): ошибка: A1854E: Неизвестный код операции 'VTST.F32', возможно, неверный целевой процессор?

Это ошибка, которая появляется, когда я перестраиваю код.

1 Ответ

2 голосов
/ 09 июня 2019

Как проверить четность числа (с плавающей запятой ...)?

Ваша проблема не связана с определенным типом процессора или языком программирования, но этоболее общая проблема:

Как уже написали Питер Кордес и Нейт Элдридж в своих комментариях, вы хотите проверить число с плавающей запятой для некоторого свойства, которое определено только для целое число numbers.

Если значение с плавающей запятой представляет некоторое целое число (например, 25.0), четность числа четко определена.Но что, если значение с плавающей запятой равно 25.6?

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

  • Однако вы также можете сказать, что программа должна округлить до ближайшего целого числа и затем выполнить операцию:

    25.6 -> 26.0 -> 26 -> even
    
  • или вы всегда хотите округлить (до минус бесконечности)

  • или вы всегда хотите округлить до нуля.

Конечно, во всех этих случаях потребуется другой код.

Вы можете преобразовать число с плавающей запятой в целое и затем проверить младший бит в целом числе.

Однако, просто преобразовав плавающее числочисло от точки до целого не всегда будет работать:

Вы можете хранить числа, которые намного больше, чем максимально возможное 64-разрядное целочисленное значение, в 32-разрядной переменной с плавающей точкой.

Iне знайкак будут вести себя процессоры ARM в этом случае;однако они могут возвращать 0x7FFFFFFF, что является нечетным числом, хотя такие большие значения с плавающей запятой могут быть только кратны 2 и, следовательно, даже целочисленных значений.

Итак, вы могли бы сделать следующее:

  • Проверить, находится ли значение с плавающей запятой внутри диапазона, который можно преобразовать в целое число
  • Если да, преобразовать число в целое числои выполните тест
  • Если нет, он должен быть кратен 2, поэтому он даже

ошибка: A1854E: неизвестный код операции 'VTST.F32', возможно, неверная цельCPU?

Операция «Побитовый тест» является побитовой операцией.Математические правила для побитовых операций определены только для целочисленных (и, возможно, фиксированных) значений.

Вам потребуются побитовые операции с плавающей запятой, которые работают с битами с одинаковым значением, а не с той же позицией в бите.шаблон;это означает, что выражение языка C ((float)i)&((float)j) приведет к тому же результату, что и (float)(i&j).

Теоретически можно было бы выполнить andtest), or и xor таким образом в программном обеспечении (not было бы невозможно), но я сомневаюсь, что любой существующий ЦП обеспечивает поддержку этого в аппаратном обеспечении.

Конечно, вы можете выполнять побитовые операции над битовым шаблоном, который представляет плавающийномер точки.Однако это не приведет к какому-либо полезному результату.

Могу ли я выполнить преобразование и поместить результат в Rn результат, который я пытался сделать,

-> VCVT.S32.F32 R0, S2

К сожалению, я раньше не работал с процессорами ARM с FPU.

Однако, насколько я понимаю, VCVT может разместить только 32-битную целочисленное значение в регистр с плавающей запятой, и вы должны использовать инструкцию VMOV, чтобы затем скопировать его в регистр Rn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...