float from reordered bytes
tony
first solution was to write the bytes to a binary file and read them as float (the snippet here does the reverse, but you get my drift)
function float2bytes(var)
variable var
make /O/B/U/n=4 w_bytes
variable refnum
open /Z=1/P=home refNum as "ieee.bin"
fbinwrite /F=4 refnum, var
FSetPos refnum, 0
FBinRead /U/F=1 refnum, w_bytes
close refnum
end
variable var
make /O/B/U/n=4 w_bytes
variable refnum
open /Z=1/P=home refNum as "ieee.bin"
fbinwrite /F=4 refnum, var
FSetPos refnum, 0
FBinRead /U/F=1 refnum, w_bytes
close refnum
end
And a programmatic solution:
// get number value of binary32 stored as 4 bytes in an 8 bit unsigned integer wave
function IEEE(w_bytes)
wave w_bytes // four bytes
// bytes should be ordered low word first, low byte first
// i.e. first byte LSB is bit 0 and 4th byte MSB is bit 31 of IEEE 754 single-precision binary floating-point format.
make /free/b/u/n=32 w_binary // seems wasteful, but keeps things organised
w_binary=(w_bytes[3-floor(p/8)]&2^(7-mod(p,8)))>0
// the 32 points of w_binary now contain contain the 32 bits of an IEEE float, starting from bit 32 (the sign bit)
variable v_sign, v_exponent, v_fraction, i
v_sign=w_binary[0]
// next 8 bits hold the exponent
v_exponent=0
for (i=0; i<8; i+=1)
v_exponent+=w_binary[8-i]*2^i
endfor
// last 23 bits hold the fraction
v_fraction=1
for (i=0; i<23; i+=1)
v_fraction+=w_binary[9+i]*2^-(i+1)
endfor
if (v_exponent==0)
if (v_fraction>1)
return (-1)^v_sign*(v_fraction-1)*2^-126
else
return (-1)^v_sign*0
endif
elseif(v_exponent==0xFF)
return nan
endif
return (-1)^v_sign*v_fraction*2^(v_exponent-127)
end
function IEEE(w_bytes)
wave w_bytes // four bytes
// bytes should be ordered low word first, low byte first
// i.e. first byte LSB is bit 0 and 4th byte MSB is bit 31 of IEEE 754 single-precision binary floating-point format.
make /free/b/u/n=32 w_binary // seems wasteful, but keeps things organised
w_binary=(w_bytes[3-floor(p/8)]&2^(7-mod(p,8)))>0
// the 32 points of w_binary now contain contain the 32 bits of an IEEE float, starting from bit 32 (the sign bit)
variable v_sign, v_exponent, v_fraction, i
v_sign=w_binary[0]
// next 8 bits hold the exponent
v_exponent=0
for (i=0; i<8; i+=1)
v_exponent+=w_binary[8-i]*2^i
endfor
// last 23 bits hold the fraction
v_fraction=1
for (i=0; i<23; i+=1)
v_fraction+=w_binary[9+i]*2^-(i+1)
endfor
if (v_exponent==0)
if (v_fraction>1)
return (-1)^v_sign*(v_fraction-1)*2^-126
else
return (-1)^v_sign*0
endif
elseif(v_exponent==0xFF)
return nan
endif
return (-1)^v_sign*v_fraction*2^(v_exponent-127)
end
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More
It's the /E flag that I was missing: "Force reshape without converting or moving data."
November 4, 2016 at 12:32 pm - Permalink