// absInt returns the absolute value of v as a *big.Int. // v must be a numeric value. func absInt(v exact.Value) *big.Int { // compute big-endian representation of v b := exact.Bytes(v) // little-endian for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { b[i], b[j] = b[j], b[i] } return new(big.Int).SetBytes(b) }
func valueToRat(x constant.Value) *big.Rat { // Convert little-endian to big-endian. // I can't believe this is necessary. bytes := constant.Bytes(x) for i := 0; i < len(bytes)/2; i++ { bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] } return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes)) }
// ufloat writes abs(x) in form of a binary exponent // followed by its mantissa bytes; x must be != 0. func (p *exporter) ufloat(x constant.Value) { mant := constant.Bytes(x) exp8 := -1 for i, b := range mant { if b != 0 { exp8 = i break } } if exp8 < 0 { panic(fmt.Sprintf("%s has no mantissa", x)) } p.int(exp8 * 8) p.bytes(mant[exp8:]) }