| // 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) | |
| } | |
| } | |
| } |