in commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java [1248:1298]
public Complex exp() {
if (Double.isInfinite(real)) {
// Set the scale factor applied to cis(y)
final double zeroOrInf;
if (real < 0) {
if (!Double.isFinite(imaginary)) {
// (−∞ + i∞) or (−∞ + iNaN) returns (±0 ± i0) (where the signs of the
// real and imaginary parts of the result are unspecified).
// Here we preserve the conjugate equality.
return new Complex(0, Math.copySign(0, imaginary));
}
// (−∞ + iy) returns +0 cis(y), for finite y
zeroOrInf = 0;
} else {
// (+∞ + i0) returns +∞ + i0.
if (imaginary == 0) {
return this;
}
// (+∞ + i∞) or (+∞ + iNaN) returns (±∞ + iNaN) and raises the invalid
// floating-point exception (where the sign of the real part of the
// result is unspecified).
if (!Double.isFinite(imaginary)) {
return new Complex(real, Double.NaN);
}
// (+∞ + iy) returns (+∞ cis(y)), for finite nonzero y.
zeroOrInf = real;
}
return new Complex(zeroOrInf * Math.cos(imaginary),
zeroOrInf * Math.sin(imaginary));
} else if (Double.isNaN(real)) {
// (NaN + i0) returns (NaN + i0)
// (NaN + iy) returns (NaN + iNaN) and optionally raises the invalid floating-point exception
// (NaN + iNaN) returns (NaN + iNaN)
return imaginary == 0 ? this : NAN;
} else if (!Double.isFinite(imaginary)) {
// (x + i∞) or (x + iNaN) returns (NaN + iNaN) and raises the invalid
// floating-point exception, for finite x.
return NAN;
}
// real and imaginary are finite.
// Compute e^a * (cos(b) + i sin(b)).
// Special case:
// (±0 + i0) returns (1 + i0)
final double exp = Math.exp(real);
if (imaginary == 0) {
return new Complex(exp, imaginary);
}
return new Complex(exp * Math.cos(imaginary),
exp * Math.sin(imaginary));
}