// Calculate determines the number of apples that Klaudia and Natalia have. func (calc *Calculator) Calculate() { var remainder big.Int // Solving 2x + diff = total for x, where Klaudia has x + diff apples and // Natalia has x apples. Since we're working with integers for efficient // but we may halve odd numbers, we need to account for a "0.5" being // introduced. calc.natalia.Sub(calc.total, calc.diff).QuoRem(&calc.natalia, big.NewInt(2), &remainder) calc.klaudia.Add(&calc.natalia, calc.diff) calc.odd = remainder.Int64() == 1 }
//encodes big.Int to base58 string func Big2Base58(val *big.Int) Base58 { answer := "" valCopy := new(big.Int).Abs(val) //copies big.Int if val.Cmp(big.NewInt(0)) <= 0 { //if it is less than 0, returns empty string return Base58("") } tmpStr := "" tmp := new(big.Int) for valCopy.Cmp(big.NewInt(0)) > 0 { //converts the number into base58 tmp.Mod(valCopy, big.NewInt(58)) //takes modulo 58 value valCopy.Div(valCopy, big.NewInt(58)) //divides the rest by 58 tmpStr += alphabet[tmp.Int64() : tmp.Int64()+1] //encodes } for i := (len(tmpStr) - 1); i > -1; i-- { answer += tmpStr[i : i+1] //reverses the order } return Base58(answer) //returns }
// a.convertTo(t) converts the value of the analyzed expression a, // which must be a constant, ideal number, to a new analyzed // expression with a constant value of type t. // // TODO(austin) Rename to resolveIdeal or something? func (a *expr) convertTo(t Type) *expr { if !a.t.isIdeal() { log.Panicf("attempted to convert from %v, expected ideal", a.t) } var rat *big.Rat // XXX(Spec) The spec says "It is erroneous". // // It is an error to assign a value with a non-zero fractional // part to an integer, or if the assignment would overflow or // underflow, or in general if the value cannot be represented // by the type of the variable. switch a.t { case IdealFloatType: rat = a.asIdealFloat()() if t.isInteger() && !rat.IsInt() { a.diag("constant %v truncated to integer", rat.FloatString(6)) return nil } case IdealIntType: i := a.asIdealInt()() rat = new(big.Rat).SetInt(i) default: log.Panicf("unexpected ideal type %v", a.t) } // Check bounds if t, ok := t.lit().(BoundedType); ok { if rat.Cmp(t.minVal()) < 0 { a.diag("constant %v underflows %v", rat.FloatString(6), t) return nil } if rat.Cmp(t.maxVal()) > 0 { a.diag("constant %v overflows %v", rat.FloatString(6), t) return nil } } // Convert rat to type t. res := a.newExpr(t, a.desc) switch t := t.lit().(type) { case *uintType: n, d := rat.Num(), rat.Denom() f := new(big.Int).Quo(n, d) f = f.Abs(f) v := uint64(f.Int64()) res.eval = func(*Thread) uint64 { return v } case *intType: n, d := rat.Num(), rat.Denom() f := new(big.Int).Quo(n, d) v := f.Int64() res.eval = func(*Thread) int64 { return v } case *idealIntType: n, d := rat.Num(), rat.Denom() f := new(big.Int).Quo(n, d) res.eval = func() *big.Int { return f } case *floatType: n, d := rat.Num(), rat.Denom() v := float64(n.Int64()) / float64(d.Int64()) res.eval = func(*Thread) float64 { return v } case *idealFloatType: res.eval = func() *big.Rat { return rat } default: log.Panicf("cannot convert to type %T", t) } return res }
func simpBig(x *big.Int) Obj { if x.Cmp(fixnum_min_Int) >= 0 && x.Cmp(fixnum_max_Int) <= 0 { return Make_fixnum(int(x.Int64())) } return wrap(x) }