ConvertSignedInt64ToDouble
hrodstein
// ConvertSignedInt64ToDouble(highWord, lowWord)
// NOTE: This routine has not been thoroughly tested.
// Converts a signed 64-bit integer expressed as two 32-bit words into a double.
// The two 32-bit words are typically read into Igor using FBinRead/F=3/U.
// Double-precision floating point can represent integer values up to 2^53 precisely.
// Above that integers are only approximated. Therefore this routine supports
// values up to +/- 2^53 and returns NaN for values that are too big.
// Examples:
// Print ConvertInt64ToDouble(0x00000000, 0x00000001) // Plus 1
// Print ConvertInt64ToDouble(0xFFFFFFFF, 0xFFFFFFFE) // Minus 1 in 2's complement
Function ConvertInt64ToDouble(highWord, lowWord)
Variable highWord, lowWord
Variable result
if ((highWord & 0x80000000) == 0)
// Positive number
if ((highWord & 0xFFE0000) != 0) // Check high order 11 bits
result = NaN
else
result = lowWord + 2^32*highWord
endif
else
// Negative number stored as 2's complement
// Theoretically the conversion would be:
// result = 2^64 - lowWord + 2^32*highWord
// result = -result
// However Igor calculations are done in double-precision floating point
// and the largest integer that it can represent precisely is 2^53. Thus
// we have to discard some of the high order bits to get the signed value
// into a range were we can do the conversion precisely.
if ((highWord & 0xFFE0000) != 0xFFE0000) // Check high order 11 bits
result = NaN
else
highWord = highWord & 0x001FFFFF // Zap 11 most significant bits
result = lowWord + 2^32*highWord
result = 2^53 - result
result = - result
endif
endif
return result
End
// NOTE: This routine has not been thoroughly tested.
// Converts a signed 64-bit integer expressed as two 32-bit words into a double.
// The two 32-bit words are typically read into Igor using FBinRead/F=3/U.
// Double-precision floating point can represent integer values up to 2^53 precisely.
// Above that integers are only approximated. Therefore this routine supports
// values up to +/- 2^53 and returns NaN for values that are too big.
// Examples:
// Print ConvertInt64ToDouble(0x00000000, 0x00000001) // Plus 1
// Print ConvertInt64ToDouble(0xFFFFFFFF, 0xFFFFFFFE) // Minus 1 in 2's complement
Function ConvertInt64ToDouble(highWord, lowWord)
Variable highWord, lowWord
Variable result
if ((highWord & 0x80000000) == 0)
// Positive number
if ((highWord & 0xFFE0000) != 0) // Check high order 11 bits
result = NaN
else
result = lowWord + 2^32*highWord
endif
else
// Negative number stored as 2's complement
// Theoretically the conversion would be:
// result = 2^64 - lowWord + 2^32*highWord
// result = -result
// However Igor calculations are done in double-precision floating point
// and the largest integer that it can represent precisely is 2^53. Thus
// we have to discard some of the high order bits to get the signed value
// into a range were we can do the conversion precisely.
if ((highWord & 0xFFE0000) != 0xFFE0000) // Check high order 11 bits
result = NaN
else
highWord = highWord & 0x001FFFFF // Zap 11 most significant bits
result = lowWord + 2^32*highWord
result = 2^53 - result
result = - result
endif
endif
return result
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More