mirror of
https://github.com/golang/go
synced 2024-11-20 00:24:43 -07:00
0c3c2c1724
float.c held bit patterns for special float64 values, hiding from the real uses. Rewrite Go code not to refer to those values directly. Convert library routines in runtime.c and string.c. LGTM=r R=r, dave CC=austin, dvyukov, golang-codereviews, iant, khr https://golang.org/cl/170330043
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
// 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)
|
|
}
|
|
}
|
|
}
|