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