Как проверить четность числа (с плавающей запятой ...)?
Ваша проблема не связана с определенным типом процессора или языком программирования, но этоболее общая проблема:
Как уже написали Питер Кордес и Нейт Элдридж в своих комментариях, вы хотите проверить число с плавающей запятой для некоторого свойства, которое определено только для целое число 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)
.
Теоретически можно было бы выполнить and
(и test
), or
и xor
таким образом в программном обеспечении (not
было бы невозможно), но я сомневаюсь, что любой существующий ЦП обеспечивает поддержку этого в аппаратном обеспечении.
Конечно, вы можете выполнять побитовые операции над битовым шаблоном, который представляет плавающийномер точки.Однако это не приведет к какому-либо полезному результату.
Могу ли я выполнить преобразование и поместить результат в Rn
результат, который я пытался сделать,
-> VCVT.S32.F32 R0, S2
К сожалению, я раньше не работал с процессорами ARM с FPU.
Однако, насколько я понимаю, VCVT
может разместить только 32-битную целочисленное значение в регистр с плавающей запятой, и вы должны использовать инструкцию VMOV
, чтобы затем скопировать его в регистр Rn
.