#!/usr/bin/env python2 # # Print out a few IEEE double representations related to the Duktape fastint # number model. # import struct import math def isFastint(x): if math.floor(x) == x and \ x >= -(2**47) and \ x < (2**47) and \ (x != 0 or math.copysign(1.0, x) == 1.0): # Negative zero is a bit tricky return True return False def stringRep(x): tmp = struct.pack('>d', x) tmphex = tmp.encode('hex') sgnexp = (ord(tmp[0]) << 8) + ord(tmp[1]) sgn = (sgnexp) >> 15 exp = (sgnexp & 0x7ff0) >> 4 manthex = tmphex[3:] return '%s sgn=%d exp=%d sgnexp=%x manthex=%s' % (tmphex, sgn, exp, sgnexp, manthex) def main(): for i in [ -(2**47) - 1, -(2**47), -(2**47) + 1, -(2**32) - 1, -(2**32), -(2**32) + 1, -(long(0xdeadbeef)), -9, -8, -8, -7, -6, -5, -4, -3, -2, -1, -0.0, # must use float to get neg zero 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, long(0xdeadbeef), (2**32) - 1, (2**32), (2**32) + 1, (2**47) - 1, (2**47) ]: print('%f %x (fastint=%s): %s' % (float(i), int(i), str(isFastint(i)), stringRep(i))) if __name__ == '__main__': main()