diff options
author | Guido van Rossum <guido@python.org> | 1992-01-26 18:16:35 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1992-01-26 18:16:35 (GMT) |
commit | 56cd67ad472dfe184767bf076d4c79dd04e85f34 (patch) | |
tree | 99a2c11441e386e3aa835b788fbdbe178ba52bdb /Objects/floatobject.c | |
parent | 5ad58c6aef158666fe94fefd9fc646483f6ad044 (diff) | |
download | cpython-56cd67ad472dfe184767bf076d4c79dd04e85f34.zip cpython-56cd67ad472dfe184767bf076d4c79dd04e85f34.tar.gz cpython-56cd67ad472dfe184767bf076d4c79dd04e85f34.tar.bz2 |
Get rid of redundant type checks.
Define % operator similar to int%int.
Diffstat (limited to 'Objects/floatobject.c')
-rw-r--r-- | Objects/floatobject.c | 79 |
1 files changed, 26 insertions, 53 deletions
diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 43cefda..7af5cd1 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -139,86 +139,70 @@ float_compare(v, w) static object * float_add(v, w) floatobject *v; - object *w; + floatobject *w; { - if (!is_floatobject(w)) { - err_badarg(); - return NULL; - } - return newfloatobject(v->ob_fval + ((floatobject *)w) -> ob_fval); + return newfloatobject(v->ob_fval + w->ob_fval); } static object * float_sub(v, w) floatobject *v; - object *w; + floatobject *w; { - if (!is_floatobject(w)) { - err_badarg(); - return NULL; - } - return newfloatobject(v->ob_fval - ((floatobject *)w) -> ob_fval); + return newfloatobject(v->ob_fval - w->ob_fval); } static object * float_mul(v, w) floatobject *v; - object *w; + floatobject *w; { - if (!is_floatobject(w)) { - err_badarg(); - return NULL; - } - return newfloatobject(v->ob_fval * ((floatobject *)w) -> ob_fval); + return newfloatobject(v->ob_fval * w->ob_fval); } static object * float_div(v, w) floatobject *v; - object *w; + floatobject *w; { - if (!is_floatobject(w)) { - err_badarg(); - return NULL; - } - if (((floatobject *)w) -> ob_fval == 0) { + if (w->ob_fval == 0) { err_setstr(ZeroDivisionError, "float division"); return NULL; } - return newfloatobject(v->ob_fval / ((floatobject *)w) -> ob_fval); + return newfloatobject(v->ob_fval / w->ob_fval); } static object * float_rem(v, w) floatobject *v; - object *w; + floatobject *w; { - double wx; - if (!is_floatobject(w)) { - err_badarg(); - return NULL; - } - wx = ((floatobject *)w) -> ob_fval; + double vx, wx; + double div, mod; + wx = w->ob_fval; if (wx == 0.0) { - err_setstr(ZeroDivisionError, "float remainder"); + err_setstr(ZeroDivisionError, "float modulo"); return NULL; } - return newfloatobject(fmod(v->ob_fval, wx)); + vx = v->ob_fval; + mod = fmod(vx, wx); + div = (vx - mod) / wx; + if (wx*mod < 0) { + mod += wx; + div -= 1.0; + } + return newfloatobject(mod); } static object * float_divmod(v, w) floatobject *v; - object *w; + floatobject *w; { double vx, wx; double div, mod; object *t; - if (!is_floatobject(w)) { - err_badarg(); - return NULL; - } - wx = ((floatobject *)w) -> ob_fval; + wx = w->ob_fval; if (wx == 0.0) { err_setstr(ZeroDivisionError, "float divmod()"); return NULL; @@ -245,15 +229,11 @@ float_divmod(v, w) static object * float_pow(v, w) floatobject *v; - object *w; + floatobject *w; { double iv, iw, ix; - if (!is_floatobject(w)) { - err_badarg(); - return NULL; - } iv = v->ob_fval; - iw = ((floatobject *)w)->ob_fval; + iw = w->ob_fval; /* Sort out special cases here instead of relying on pow() */ if (iw == 0.0) return newfloatobject(1.0); /* x**0 is 1, even 0**0 */ @@ -347,10 +327,3 @@ typeobject Floattype = { 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ }; - -/* -XXX This is not enough. Need: -- automatic casts for mixed arithmetic (3.1 * 4) -- mixed comparisons (!) -- look at other uses of ints that could be extended to floats -*/ |