/* Package ftoa provides ECMAScript-compliant floating point number conversion to string. It contains code ported from Rhino (https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/DToA.java) as well as from the original code by David M. Gay. See LICENSE_LUCENE for the original copyright message and disclaimer. */
package ftoa import ( ) const ( frac_mask = 0xfffff exp_shift = 20 exp_msk1 = 0x100000 exp_shiftL = 52 exp_mask_shifted = 0x7ff frac_maskL = 0xfffffffffffff exp_msk1L = 0x10000000000000 exp_shift1 = 20 exp_mask = 0x7ff00000 bias = 1023 p = 53 bndry_mask = 0xfffff log2P = 1 ) func lo0bits( uint32) ( int) { if ( & 7) != 0 { if ( & 1) != 0 { return 0 } if ( & 2) != 0 { return 1 } return 2 } if ( & 0xffff) == 0 { = 16 >>= 16 } if ( & 0xff) == 0 { += 8 >>= 8 } if ( & 0xf) == 0 { += 4 >>= 4 } if ( & 0x3) == 0 { += 2 >>= 2 } if ( & 1) == 0 { ++ >>= 1 if ( & 1) == 0 { return 32 } } return } func hi0bits( uint32) ( int) { if ( & 0xffff0000) == 0 { = 16 <<= 16 } if ( & 0xff000000) == 0 { += 8 <<= 8 } if ( & 0xf0000000) == 0 { += 4 <<= 4 } if ( & 0xc0000000) == 0 { += 2 <<= 2 } if ( & 0x80000000) == 0 { ++ if ( & 0x40000000) == 0 { return 32 } } return } func stuffBits( []byte, int, uint32) { [] = byte( >> 24) [+1] = byte( >> 16) [+2] = byte( >> 8) [+3] = byte() } func d2b( float64, []byte) (, int, []byte) { := math.Float64bits() := uint32( >> 32) := uint32() := & frac_mask &= 0x7fffffff /* clear sign bit, which we ignore */ var , , int if = int( >> exp_shift); != 0 { |= exp_msk1 } := if != 0 { = [:8] = lo0bits() >>= if != 0 { stuffBits(, 4, |<<(32-)) >>= } else { stuffBits(, 4, ) } stuffBits(, 0, ) if != 0 { = 2 } else { = 1 } } else { = [:4] = lo0bits() >>= stuffBits(, 0, ) += 32 = 1 } if != 0 { = - bias - (p - 1) + = p - } else { = - bias - (p - 1) + 1 + = 32* - hi0bits() } return }