2016-11-03 1 views
1

아암 텍스 M4F 프로세서에서와 ​​같이, 부동 소수점 레지스터에 즉치 상수를로드하는 명령을 보유 +/- mx 2 -n으로 표현 될 수 있으며, 여기서 m은 16-31 범위의 정수이고 n은 0-7 범위의 정수입니다. 예를 들어 m = 27 및 n = 2 인 6.75를 얻을 수 있기 때문에 위의 지침이 작동합니다.허용되는 ARM Cortex-M4F 부동 소수점 즉시 처리 알고리즘?</p> <pre><code> VMOV S0,+6.75 </code></pre> <p>그러나, 상수 값이 한정되어 있고 값이 같아야한다 :

특정 실수가 이런 식으로 표현 될 수 있는지 여부를 결정하는 알고리즘을 찾고 싶다면 m과 n의 해당 값을 제공하십시오.

뛰어난 통찰력이 있습니까?

+0

FWIW, 내가 답을 알고하지 않습니다,하지만 그들은 처음부터 그런 지시를 인코딩 할 때 무엇을해야 어셈블러 정확하게 때문에 나는 간단한 방법이 존재해야한다는 것을 추론 _can_.약간의 문제를 해결하기 위해 [여기 어셈블러가 있습니다] (https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=gas/config/tc-arm.c;h= 061aaa8222d03f6e52953ae3fdcd1e047d7bbee3; hb = HEAD # l4995) - 어떤 부두가 시작 되든 시작하는 것은 일반적인 IEEE754 플로트와 같은 것으로 보이므로, 그 중 하나로서 표현 될 수 있는지 여부를 파악해야합니다. – Notlikethat

+0

C 수학 라이브러리를 사용할 수 있다면 frexp가 시작하는 방법 일 수 있습니다 – dmuir

답변

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 
} 
0

인 정규 단 정밀도 부동 소수점 수를 계산 한 다음 그 비트 수를 검사합니다. 수식으로 표현할 수있는 모든 숫자도 수레로 표현할 수 있지만 일부 수레 만 수식으로 표현할 수 있습니다.

수식으로 표현할 수있는 숫자의 경우 지수는 -3 (16 * 2^-7)과 +4 (16 * 2^0) 사이에 있어야하며 모든 가제가 0으로 보장됩니다 십진법 이후의 상위 4 비트. 따라서 비트 23-30에 포함 된 바이트는 124와 131 사이의 값을 가져야하고 비트 0-18은 0이어야합니다. n을 결정하기 위해, 131에서 지수 바이트를 뺍니다. m을 결정하려면 19-22 비트를 사용하여 16을 더하십시오.

이 모든 것은 처음에 숫자를 부동 소수점으로 저장할 수 있다는 것을 알고 있다고 가정합니다.

0

단지 8 * 16 * 2 = 256 값이기 때문에 쉬운 방법은 해시 테이블을 사용하는 것입니다. 파이썬에서 :

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 
0

감사를 사용하는 것입니다 제공합니다. 회고하면서, 나는 아마도 조금 더 많은 문맥을 제공해야만했다. 저는 대학 2 학년을 대상으로 어셈블리 언어 프로그래밍에 관한 강좌를 가르치고 Cortex-M4F를 대상 플랫폼으로 사용합니다. 나는 VMOV가 즉시 가능할 때 알 수있는 간단한 방법을 찾으려고 노력했다. 나는 마침내 (약간의 embarresment로) m과 n의 조합이 거의 없다는 것을 깨달았습니다. 최선의 해결책은 유인물의 형태로 모든 조합을 인쇄하는 것이 었습니다. :-)

다시 한번 감사드립니다!

댄 -

관련 문제