如何测试数字的奇偶校验(浮点数-ARM)?

时间:2019-06-09 00:04:33

标签: assembly arm

我正在编写代码,我想检查数字的奇偶性,以在数字为奇数时将信号更改为负,而在偶数时为正号。

我尝试使用VTST.F32 S0#1.0,​​因为我在使用Rn寄存器时使用TST R0,#1 p.ex来处理浮点运算。 还是针对FP的指令,还是我必须使用另一条指令?

FP-Fatorial.s(111):错误:A1854E:未知的操作码'VTST.F32',也许是错误的目标CPU?

这是我重建代码时出现的错误。

1 个答案:

答案 0 :(得分:2)

  

如何测试数字的奇偶性(浮点数...)?

您的问题与特定的CPU类型或编程语言无关,但这是一个更普遍的问题:

正如Peter Cordes和Nate Eldredge在其评论中所写的那样,您想检查仅为整数数字定义的某些属性的浮点数数字。

>

如果浮点值表示某个整数值(例如25.0),则数字的奇偶校验是明确定义的。但是,如果浮点值为25.6会怎样?

  • 您现在可以说,可以保证浮点数在小数点后不会有任何数字,因此程序无需能够处理这种情况。

  • 但是,您可能还说程序应该四舍五入到最接近的整数并执行以下操作:

    25.6 -> 26.0 -> 26 -> even
    
  • 或者您总是想向下取整(向负无穷大)

  • 或者您总是想四舍五入。

当然,所有这些情况将需要不同的代码。

您可以将浮点数转换为整数,然后测试整数中的最低位。

但是,仅将浮点数转换为整数并不总是可行:

您可以在32位浮点变量中存储比最大可能的64位整数值大得多的数字。

在这种情况下,我不知道ARM CPU的表现如何;但是,它们可能返回0x7FFFFFFF,这是一个奇数数字,尽管如此大的浮点值只能是2的倍数,因此偶数是整数值。< / p>

因此,您可以执行以下操作:

  • 检查浮点值是否在可以转换为整数的范围内
  • 如果是,则将数字转换为整数并执行测试
  • 如果否,那么它必须是2的倍数,所以它是偶数
  

错误:A1854E:未知的操作码'VTST.F32',也许是错误的目标CPU?

“按位测试”操作是按位操作。按位运算的数学规则仅针对整数(可能是定点)值定义。

您将需要按位浮点运算,这些浮点运算应在具有相同重要性而不是在位模式中位于相同位置的位上进行;这意味着C语言表达式((float)i)&((float)j)将导致与(float)(i&j)相同的结果。

从理论上讲,可以通过这种方式在软件中执行and(和test),orxor(不可能not) ,但我怀疑是否有任何现有的CPU在硬件上对此提供支持。

当然,您可以对表示浮点数的位模式执行按位操作。但是,这不会导致任何有用的结果。

  

我可以进行转换并将结果放入我尝试做的Rn结果中

     

-> VCVT.S32.F32 R0, S2

不幸的是,我以前从未使用过带有FPU的ARM CPU。

但是,据我所知VCVT只能将32位 integer 值放入浮点寄存器中,并且您必须使用VMOV指令然后将其复制到Rn寄存器中。