diff options
| author | Michaël Cadilhac | 2007-10-01 09:17:29 +0000 |
|---|---|---|
| committer | Michaël Cadilhac | 2007-10-01 09:17:29 +0000 |
| commit | 2742fe306859d828cbeff3ae0371e2217b09cd4c (patch) | |
| tree | 69112996f8574c08ea9291d0083d84f2fc671bf5 /src/floatfns.c | |
| parent | 5db17239182556967bfaa5723214f31b8a91db6f (diff) | |
| download | emacs-2742fe306859d828cbeff3ae0371e2217b09cd4c.tar.gz emacs-2742fe306859d828cbeff3ae0371e2217b09cd4c.zip | |
(Fexpt): Manually check for overflows, so that a power
of a non-zero value can't yield zero.
Diffstat (limited to 'src/floatfns.c')
| -rw-r--r-- | src/floatfns.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/floatfns.c b/src/floatfns.c index 6ad9b95686e..a20f7981bf0 100644 --- a/src/floatfns.c +++ b/src/floatfns.c | |||
| @@ -454,7 +454,7 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0, | |||
| 454 | (arg1, arg2) | 454 | (arg1, arg2) |
| 455 | register Lisp_Object arg1, arg2; | 455 | register Lisp_Object arg1, arg2; |
| 456 | { | 456 | { |
| 457 | double f1, f2; | 457 | double f1, f2, f3; |
| 458 | 458 | ||
| 459 | CHECK_NUMBER_OR_FLOAT (arg1); | 459 | CHECK_NUMBER_OR_FLOAT (arg1); |
| 460 | CHECK_NUMBER_OR_FLOAT (arg2); | 460 | CHECK_NUMBER_OR_FLOAT (arg2); |
| @@ -500,8 +500,11 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0, | |||
| 500 | else if ((f1 == 0.0 && f2 < 0.0) || (f1 < 0 && f2 != floor(f2))) | 500 | else if ((f1 == 0.0 && f2 < 0.0) || (f1 < 0 && f2 != floor(f2))) |
| 501 | domain_error2 ("expt", arg1, arg2); | 501 | domain_error2 ("expt", arg1, arg2); |
| 502 | #endif | 502 | #endif |
| 503 | IN_FLOAT2 (f1 = pow (f1, f2), "expt", arg1, arg2); | 503 | IN_FLOAT2 (f3 = pow (f1, f2), "expt", arg1, arg2); |
| 504 | return make_float (f1); | 504 | /* Check for overflow in the result. */ |
| 505 | if (f1 != 0.0 && f3 == 0.0) | ||
| 506 | range_error ("expt", arg1); | ||
| 507 | return make_float (f3); | ||
| 505 | } | 508 | } |
| 506 | 509 | ||
| 507 | DEFUN ("log", Flog, Slog, 1, 2, 0, | 510 | DEFUN ("log", Flog, Slog, 1, 2, 0, |