blob: ec50f8947090a22a26bd822bae8b53e31c0d549f [file] [log] [blame]
 // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package runtime func complex128div(n complex128, d complex128) complex128 { // Special cases as in C99. ninf := real(n) == posinf || real(n) == neginf || imag(n) == posinf || imag(n) == neginf dinf := real(d) == posinf || real(d) == neginf || imag(d) == posinf || imag(d) == neginf nnan := !ninf && (real(n) != real(n) || imag(n) != imag(n)) dnan := !dinf && (real(d) != real(d) || imag(d) != imag(d)) switch { case nnan || dnan: return complex(nan, nan) case ninf && !dinf: return complex(posinf, posinf) case !ninf && dinf: return complex(0, 0) case real(d) == 0 && imag(d) == 0: if real(n) == 0 && imag(n) == 0 { return complex(nan, nan) } else { return complex(posinf, posinf) } default: // Standard complex arithmetic, factored to avoid unnecessary overflow. a := real(d) if a < 0 { a = -a } b := imag(d) if b < 0 { b = -b } if a <= b { ratio := real(d) / imag(d) denom := real(d)*ratio + imag(d) return complex((real(n)*ratio+imag(n))/denom, (imag(n)*ratio-real(n))/denom) } else { ratio := imag(d) / real(d) denom := imag(d)*ratio + real(d) return complex((imag(n)*ratio+real(n))/denom, (imag(n)-real(n)*ratio)/denom) } } }