diff options
| author | Guido van Rossum <guido@python.org> | 1991-10-20 20:16:45 +0000 |
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 1991-10-20 20:16:45 +0000 |
| commit | 15ecff4c5e98557127c4b99969531d110fc18c1a (patch) | |
| tree | 66b5dd17680e9e30d5882897e23ba3308172b2bf /Objects/floatobject.c | |
| parent | 5063bab9735a7b2d91ad58820c51455f87a9bea1 (diff) | |
| download | cpython-git-15ecff4c5e98557127c4b99969531d110fc18c1a.tar.gz | |
Finally implemented divmod().
Diffstat (limited to 'Objects/floatobject.c')
| -rw-r--r-- | Objects/floatobject.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/Objects/floatobject.c b/Objects/floatobject.c index a386e0c2f1..d89e1cb334 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -203,13 +203,35 @@ float_divmod(v, w) floatobject *v; object *w; { - double wx; + double vx, wx; + double div, mod; + object *t; if (!is_floatobject(w)) { err_badarg(); return NULL; } - err_setstr(RuntimeError, "divmod() on float not implemented"); - return NULL; + wx = ((floatobject *)w) -> ob_fval; + if (wx == 0.0) { + err_setstr(ZeroDivisionError, "float division by zero"); + return NULL; + } + vx = v->ob_fval; + mod = fmod(vx, wx); + div = (vx - mod) / wx; + if (wx*mod < 0) { + mod += wx; + div -= 1.0; + } + t = newtupleobject(2); + if (t != NULL) { + settupleitem(t, 0, newfloatobject(div)); + settupleitem(t, 1, newfloatobject(mod)); + if (err_occurred()) { + DECREF(t); + t = NULL; + } + } + return t; } static object * |
