## 1750A to Float Conversion

Michael Jacobson: For the conversion of IEEE floating point numbers here are two Tcl procedures to convert to and from a MIL-STD-1750A 32-bit floating number. The procedure 1750afloat take a integer value (1750a) and returns the floating point representation. The procedure float1750a take a floating point number and returns the integer representation of the 1750a value

if {0} {
1750A floating point numbers are represented as a fractional
mantissa times 2 raised to the power of the exponent.
The 32-bit format is:
MSB                                   LSB
smmm mmmm mmmm mmmm mmmm mmmm seee eeee
0                                     31
}

proc 1750afloat {32BitInt_1750a} {
if {![string is integer \$32BitInt_1750a]} {
return "invalid input: \"\$32BitInt_1750a\" not a integer"
}
set mantissa [expr {\$32BitInt_1750a >> 8}]
set exponent [expr {\$32BitInt_1750a & 0xff}]
if {[expr {\$exponent & 0x80}] != 0} {
set exponent [expr {int(\$exponent - 256)}]
}
set fnd_float [expr {\$mantissa * pow(2, \$exponent - 23)}]
return \$fnd_float
}

proc float1750a {floatnum} {
if {![string is double \$floatnum]} {
return "invalid input: \"\$floatnum\" not a double"
}
if {\$floatnum == 0} {
set 32BitInt_1750a 0
} else {
# you just have to love math
set exponent [expr {int(ceil(log(abs(\$floatnum)) / log(2.)))}]
set mantissa [expr {round(\$floatnum / pow(2, \$exponent - 23))}]
#boundary condition check and repair at 0x800000
if {\$mantissa == 8388608} {
set mantissa [expr {\$mantissa / 2}]
incr exponent
}
set 32BitInt_1750a [expr {(\$mantissa << 8) | (\$exponent & 0xff)}]
}
return \$32BitInt_1750a
}

# examples per MIL-STD-1750A section 4.1.5

format %X [float1750a [expr .9999999 * pow(2,127)]] ;#7FFFFF7F
format %X [float1750a [expr .5 * pow(2,127)]] ;#4000007F
format %X [float1750a [expr .625 * pow(2,4)]] ;#50000004
format %X [float1750a [expr .5 * pow(2,1)]] ;#40000001
format %X [float1750a [expr .5 * pow(2,0)]] ;#40000000
format %X [float1750a [expr .5 * pow(2,-1)]] ;#400000FF
format %X [float1750a [expr .5 * pow(2,-128)]] ;#40000080
format %X [float1750a [expr .0 * pow(2,0)]] ;#0
format %X [float1750a [expr -1.0 * pow(2,0)]] ;#80000000
format %X [float1750a [expr -.5000001 * pow(2,-128)]] ;#BFFFFF80
format %X [float1750a [expr -.7500001 * pow(2,4)]] ;#9FFFFF04

# wrap test of the procedures

1750afloat [float1750a 1.222332] ;#1.22233200073

 Category Mathematics