static Scheme_Object *fx_abs(int argc, Scheme_Object *argv[]) { Scheme_Object *o; if (!SCHEME_INTP(argv[0])) scheme_wrong_contract("fxabs", "fixnum?", 0, argc, argv); o = scheme_abs(argc, argv); if (!SCHEME_INTP(o)) scheme_non_fixnum_result("fxabs", o); return o; }
static Scheme_Object *unsafe_fx_abs(int argc, Scheme_Object *argv[]) { intptr_t v; if (scheme_current_thread->constant_folding) return scheme_abs(argc, argv); v = SCHEME_INT_VAL(argv[0]); if (v < 0) v = -v; return scheme_make_integer(v); }
Scheme_Object *scheme_complex_divide(const Scheme_Object *_n, const Scheme_Object *_d) { Scheme_Complex *cn = (Scheme_Complex *)_n; Scheme_Complex *cd = (Scheme_Complex *)_d; Scheme_Object *den, *r, *i, *a, *b, *c, *d, *cm, *dm, *aa[1]; int swap; if ((cn->r == zero) && (cn->i == zero)) return zero; a = cn->r; b = cn->i; c = cd->r; d = cd->i; /* Check for exact-zero simplifications in d: */ if (c == zero) { i = scheme_bin_minus(zero, scheme_bin_div(a, d)); r = scheme_bin_div(b, d); return scheme_make_complex(r, i); } else if (d == zero) { r = scheme_bin_div(a, c); i = scheme_bin_div(b, c); return scheme_make_complex(r, i); } if (!SCHEME_FLOATP(c) && !SCHEME_FLOATP(d)) { /* The simple way: */ cm = scheme_bin_plus(scheme_bin_mult(c, c), scheme_bin_mult(d, d)); r = scheme_bin_div(scheme_bin_plus(scheme_bin_mult(c, a), scheme_bin_mult(d, b)), cm); i = scheme_bin_div(scheme_bin_minus(scheme_bin_mult(c, b), scheme_bin_mult(d, a)), cm); return scheme_make_complex(r, i); } if (scheme_is_zero(d)) { /* This is like dividing by a real number, except that the inexact 0 imaginary part can interact with +inf.0 and +nan.0 */ r = scheme_bin_plus(scheme_bin_div(a, c), /* Either 0.0 or +nan.0: */ scheme_bin_mult(d, b)); i = scheme_bin_minus(scheme_bin_div(b, c), /* Either 0.0 or +nan.0: */ scheme_bin_mult(d, a)); return scheme_make_complex(r, i); } if (scheme_is_zero(c)) { r = scheme_bin_plus(scheme_bin_div(b, d), /* Either 0.0 or +nan.0: */ scheme_bin_mult(c, a)); i = scheme_bin_minus(scheme_bin_mult(c, b), /* either 0.0 or +nan.0 */ scheme_bin_div(a, d)); return scheme_make_complex(r, i); } aa[0] = c; cm = scheme_abs(1, aa); aa[0] = d; dm = scheme_abs(1, aa); if (scheme_bin_lt(cm, dm)) { cm = a; a = b; b = cm; cm = c; c = d; d = cm; swap = 1; } else swap = 0; r = scheme_bin_div(c, d); den = scheme_bin_plus(d, scheme_bin_mult(c, r)); if (swap) i = scheme_bin_div(scheme_bin_minus(a, scheme_bin_mult(b, r)), den); else i = scheme_bin_div(scheme_bin_minus(scheme_bin_mult(b, r), a), den); r = scheme_bin_div(scheme_bin_plus(b, scheme_bin_mult(a, r)), den); return scheme_make_complex(r, i); }