\[\frac{b \cdot c - a \cdot d}{c \cdot c + d \cdot d}
\]
↓
\[\begin{array}{l}
t_0 := \frac{b \cdot c - a \cdot d}{c \cdot c + d \cdot d}\\
t_1 := -\frac{a}{d}\\
\mathbf{if}\;d \leq -900000000000:\\
\;\;\;\;t_1 + b \cdot \frac{c}{{d}^{2}}\\
\mathbf{elif}\;d \leq -1.35 \cdot 10^{-139}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;d \leq 1.6 \cdot 10^{-149}:\\
\;\;\;\;\frac{b}{c} + a \cdot \left(-\frac{d}{{c}^{2}}\right)\\
\mathbf{elif}\;d \leq 3.8 \cdot 10^{+108}:\\
\;\;\;\;t_0\\
\mathbf{else}:\\
\;\;\;\;t_1\\
\end{array}
\]
(FPCore (a b c d)
:precision binary64
(/ (- (* b c) (* a d)) (+ (* c c) (* d d))))
↓
(FPCore (a b c d)
:precision binary64
(let* ((t_0 (/ (- (* b c) (* a d)) (+ (* c c) (* d d)))) (t_1 (- (/ a d))))
(if (<= d -900000000000.0)
(+ t_1 (* b (/ c (pow d 2.0))))
(if (<= d -1.35e-139)
t_0
(if (<= d 1.6e-149)
(+ (/ b c) (* a (- (/ d (pow c 2.0)))))
(if (<= d 3.8e+108) t_0 t_1))))))
double code(double a, double b, double c, double d) {
return ((b * c) - (a * d)) / ((c * c) + (d * d));
}
↓
double code(double a, double b, double c, double d) {
double t_0 = ((b * c) - (a * d)) / ((c * c) + (d * d));
double t_1 = -(a / d);
double tmp;
if (d <= -900000000000.0) {
tmp = t_1 + (b * (c / pow(d, 2.0)));
} else if (d <= -1.35e-139) {
tmp = t_0;
} else if (d <= 1.6e-149) {
tmp = (b / c) + (a * -(d / pow(c, 2.0)));
} else if (d <= 3.8e+108) {
tmp = t_0;
} else {
tmp = t_1;
}
return tmp;
}
real(8) function code(a, b, c, d)
real(8), intent (in) :: a
real(8), intent (in) :: b
real(8), intent (in) :: c
real(8), intent (in) :: d
code = ((b * c) - (a * d)) / ((c * c) + (d * d))
end function
↓
real(8) function code(a, b, c, d)
real(8), intent (in) :: a
real(8), intent (in) :: b
real(8), intent (in) :: c
real(8), intent (in) :: d
real(8) :: t_0
real(8) :: t_1
real(8) :: tmp
t_0 = ((b * c) - (a * d)) / ((c * c) + (d * d))
t_1 = -(a / d)
if (d <= (-900000000000.0d0)) then
tmp = t_1 + (b * (c / (d ** 2.0d0)))
else if (d <= (-1.35d-139)) then
tmp = t_0
else if (d <= 1.6d-149) then
tmp = (b / c) + (a * -(d / (c ** 2.0d0)))
else if (d <= 3.8d+108) then
tmp = t_0
else
tmp = t_1
end if
code = tmp
end function
public static double code(double a, double b, double c, double d) {
return ((b * c) - (a * d)) / ((c * c) + (d * d));
}
↓
public static double code(double a, double b, double c, double d) {
double t_0 = ((b * c) - (a * d)) / ((c * c) + (d * d));
double t_1 = -(a / d);
double tmp;
if (d <= -900000000000.0) {
tmp = t_1 + (b * (c / Math.pow(d, 2.0)));
} else if (d <= -1.35e-139) {
tmp = t_0;
} else if (d <= 1.6e-149) {
tmp = (b / c) + (a * -(d / Math.pow(c, 2.0)));
} else if (d <= 3.8e+108) {
tmp = t_0;
} else {
tmp = t_1;
}
return tmp;
}
def code(a, b, c, d):
return ((b * c) - (a * d)) / ((c * c) + (d * d))
↓
def code(a, b, c, d):
t_0 = ((b * c) - (a * d)) / ((c * c) + (d * d))
t_1 = -(a / d)
tmp = 0
if d <= -900000000000.0:
tmp = t_1 + (b * (c / math.pow(d, 2.0)))
elif d <= -1.35e-139:
tmp = t_0
elif d <= 1.6e-149:
tmp = (b / c) + (a * -(d / math.pow(c, 2.0)))
elif d <= 3.8e+108:
tmp = t_0
else:
tmp = t_1
return tmp
function code(a, b, c, d)
return Float64(Float64(Float64(b * c) - Float64(a * d)) / Float64(Float64(c * c) + Float64(d * d)))
end
herbie shell --seed 2023074
(FPCore (a b c d)
:name "Complex division, imag part"
:precision binary64
:herbie-target
(if (< (fabs d) (fabs c)) (/ (- b (* a (/ d c))) (+ c (* d (/ d c)))) (/ (+ (- a) (* b (/ c d))) (+ d (* c (/ c d)))))
(/ (- (* b c) (* a d)) (+ (* c c) (* d d))))