ARM Cortex-M4F处理器有一条指令,可将立即数加载到浮点寄存器中,如下所示:
VMOV S0,+6.75
但是,常量的值受到限制,必须等于可以表示为+/- mx 2 -n 的值,其中m是16-31范围内的整数n是0-7范围内的整数。例如,上述指令有效,因为你可以得到6.75,其中m = 27,n = 2。
我真的很想找到一种算法来确定某个特定的实数是否可以用这种方式表示,如果是,则给出相应的m和n值。
任何精彩的见解?
丹
答案 0 :(得分:0)
其实我没有测试它,但看起来很容易。将数字乘以1,2,4,8等,最多为0x80。它会导致16到31之间的整数/整数吗?在这种情况下6.75 * 4 = 27.所以m是27 n是2. 2.8750 * 8 = 23所以m是23,n是3.
float vut; //value under test
float f;
unsigned int nn;
int n;
unsigned int m;
for(nn=0x01;nn<=0x80;nn<<=1)
{
f=vut*n;
if(is_an_integer_no_fraction(f))
{
m=f;
if((m>=16)&&(m<=31))
{
n=nn;
n=-n;
//FOUND m and n
break;
}
}
}
if(nn>=0x80)
{
//NOPE doesnt work
}
else
{
//YEP found m and n
}
答案 1 :(得分:0)
如果您愿意,可以通过转换为常规单精度浮点数,然后检查其位来实现。您的公式可表示的所有数字也可表示为浮点数,但只有一些浮点数可由您的公式表示。
对于您的公式可表示的任何数字,指数保证在-3(16 * 2 ^ -7)和+4(16 * 2 ^ 0)之间,并且尾数保证在所有数字中都为零小数点后的前四位。因此,包含在位23-30中的字节必须具有介于124和131之间的值,并且0-18位必须为零。要确定n,从131减去指数字节;要确定m,请使用包含19-22的位并添加16。
请注意,这一切都假设您知道该号码可以首先存储为浮点数。
答案 2 :(得分:0)
它只有8 * 16 * 2 = 256个值,因此一种简单的方法是使用哈希表。在Python中:
D = set()
for m in range(16,32):
for n in range(8):
x = m*2.0**-n
D.add(x)
D.add(-x)
def iscortexable(x):
return x in D
给出
>>> iscortexable(6.75)
True
>>> iscortexable(8.75)
False
更有原则的方式是使用frexp
from math import frexp
def iscortexable(x):
if x == 0:
return False
m, e = frexp(x) # 0.5 <= m < 1
m = m*32 # 16 <= m < 32
n = -(e - 5)
return m.is_integer() and 0 <= n <= 7
答案 3 :(得分:0)
感谢大家提出的好建议。回想起来,我应该提供更多的背景信息。我教大学二年级学生汇编语言编程课程,并使用Cortex-M4F作为目标平台。我试图找到一种简单的方法让他们知道VMOV立即可行的时间。我终于意识到(有些尴尬)m和n的组合很少,最好的解决办法就是以一份讲义的形式打印出所有组合。 :-)
再次感谢!
丹 -