// 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 isposinf(f float64) bool { return f > maxFloat64 } func isneginf(f float64) bool { return f < -maxFloat64 } func isnan(f float64) bool { return f != f } func nan() float64 { var f float64 = 0 return f / f } func posinf() float64 { var f float64 = maxFloat64 return f * f } func neginf() float64 { var f float64 = maxFloat64 return -f * f } func complex128div(n complex128, d complex128) complex128 { // Special cases as in C99. ninf := isposinf(real(n)) || isneginf(real(n)) || isposinf(imag(n)) || isneginf(imag(n)) dinf := isposinf(real(d)) || isneginf(real(d)) || isposinf(imag(d)) || isneginf(imag(d)) nnan := !ninf && (isnan(real(n)) || isnan(imag(n))) dnan := !dinf && (isnan(real(d)) || isnan(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) } } }