ConvertSignedInt64ToDouble

NOTE: This routine has not been thoroughly tested.

// 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

Forum

Support

Gallery

Igor Pro 8

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More