| Index: src/pkg/math/big/int_cap.go |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/src/pkg/math/big/int_cap.go |
| @@ -0,0 +1,49 @@ |
| +package big |
| + |
| +func (z *Int) SetC(x *Int) *Int { |
| + if z != x { |
| + z.abs = z.abs.setC(x.abs) |
| + z.neg = x.neg |
| + } |
| + return z |
| +} |
| + |
| +func (z *Int) AddC(x, y *Int) *Int { |
| + neg := x.neg |
| + if x.neg == y.neg { |
| + // x + y == x + y |
| + // (-x) + (-y) == -(x + y) |
| + z.abs = z.abs.addC(x.abs, y.abs) |
| + } else { |
| + panic("not yet implemented") //FIXME |
| + // x + (-y) == x - y == -(y - x) |
| + // (-x) + y == y - x == -(x - y) |
| + if x.abs.cmp(y.abs) >= 0 { |
| + z.abs = z.abs.sub(x.abs, y.abs) |
| + } else { |
| + neg = !neg |
| + z.abs = z.abs.sub(y.abs, x.abs) |
| + } |
| + } |
| + z.neg = len(z.abs) > 0 && neg // 0 has no sign |
| + return z |
| +} |
| + |
| +func (x *Int) CmpC(y *Int) (r int) { |
| + // x cmp y == x cmp y |
| + // x cmp (-y) == x |
| + // (-x) cmp y == y |
| + // (-x) cmp (-y) == -(x cmp y) |
| + switch { |
| + case x.neg == y.neg: |
| + r = x.abs.cmpC(y.abs) |
| + if x.neg { |
| + r = -r |
| + } |
| + case x.neg: |
| + r = -1 |
| + default: |
| + r = 1 |
| + } |
| + return |
| +} |