|
From: Barton W. <wil...@us...> - 2025-12-01 17:18:49
|
For the pure binary64 complex float case, my favorite method scales the real and imaginary parts by powers of two (no rounding errors).
~~~
(defun hypotenouse-binary64 (re im)
(flet ((binary64-exponent (x) (nth-value 1 (decode-float x))))
(let ((m (- (max (binary64-exponent re) (binary64-exponent im)))))
(setq re (scale-float re m)
im (scale-float im m))
(scale-float (sqrt (+ (* re re) (* im im))) (- m)))))
~~~
---
**[bugs:#4638] cabs/carg/polarform overflow and underflow**
**Status:** open
**Group:** None
**Labels:** cabs carg
**Created:** Sat Nov 29, 2025 07:18 AM UTC by Stavros Macrakis
**Last Updated:** Mon Dec 01, 2025 04:02 PM UTC
**Owner:** nobody
``cabs`` and ``carg`` on complex floats overflow and underflow even when the result is perfectly representable:
<pre>
cabs(1e-170 + %i*1e-170) => 0.0
but float(cabs(bfloat(1e-170 + %i*1e-170))) => 1.414213562373095e-170
cabs(1e170 + %i*1e+170) => overflow
but float(cabs(bfloat(1e170 + %i*1e170))) => 1.4142135623730952e170
carg(1e170 + %i*1e+170)) => overflow
but float(carg(bfloat(1e170 + %i*1e+170))) => 0.7853981633974483
carg(1e-310 + %i*1e-310) => overflow
but carg(1b-310 + %i*1b-310) => 7.853981633974483b-1
polarform(1e170 + %i*1e+170) => overflow
</pre>
Tested in Maxima 5.48.1 SBCL 2.5.7 MacOS Intel
---
Sent from sourceforge.net because max...@li... is subscribed to https://sourceforge.net/p/maxima/bugs/
To unsubscribe from further messages, a project admin can change settings at https://sourceforge.net/p/maxima/admin/bugs/options. Or, if this is a mailing list, you can unsubscribe from the mailing list. |