次の規則に従って、python float を TI DSP TMS320C30 float 表現に変換する必要があります。
http://www.ti.com/lit/an/spra400/spra400.pdf#page=13
いくつか試してみましたが、提案されたアルゴリズムに頭を悩ませているようには見えません。アルゴリズムのC バージョンも見つけましたが、TI DSP で実行されるバージョンのように見えるため、理解できない操作があります (たとえば、符号を逆にします)。
以下の非常に単純な実装がありますが、機能しません...
# see http://www.ti.com/lit/an/spra400/spra400.pdf
import math
def twos_comp(val, bits):
"""compute the 2's complement of int value val"""
if( (val&(1<<(bits-1))) != 0 ):
val = val - (1<<bits)
return val
def float_to_ti( f ):
m,e = math.frexp( f )
# print m, e,
mantissa = int(str(m)[2:])
exponent = twos_comp((e - 127), 8) if e != 0 else (-128)
sign = 1 if f < 0 else 0
# print sign, mantissa, exponent
return ((sign << 30) + (exponent << 24) + mantissa) & 0xffffffff
期待値の例:
# Float TI Decimal value of the resulting 32bits
#################################################
# 0.0 2147483648
# 1.0 0
# 100 105381888
# 0.000021 4029688104
# 10 52428800
# -1.0 4286578688
# -10.0 65011712
# -0.0021 4160118745
# -84.5487 114747153
要するに、Pythonが仮数/仮数を返す方法にあると思いますが、よくわかりません。
ここでどのように物事を始めますか?
注:関連する可能性のあるこの質問を見つけました。構造体のパックとアンパックを調べます..
参考までに、次のように DSP にロードする C プログラムで理論値を取得しました。
{
float f = -1.0; printf("F: %f -> %u", f, *(unsigned int*)&f);
f = -10.0; printf("F: %f -> %u", f, *(unsigned int*)&f);
f = -0.0021; printf("F: %f -> %u", f, *(unsigned int*)&f);
f = -84.5487; printf("F: %f -> %u", f, *(unsigned int*)&f);
}
実用的な実装
Armin's answer に従って、負の数に対して機能するようになりました。
def float_to_ti(f):
m, e = math.frexp(f)
ma = m
m = abs(m * 2)
e -= 1
sign = (math.copysign(1.0, f) < 0)
man = int((m - 1.0) * (1 << 23))
if sign:
man *= -1
if e == 0 and sign == 1:
e = 255
if f == 0.0:
return (128 << 24) | (sign << 23)
return ((e & 0xff) << 24) | (sign << 23) | man & 0x7fffff