From 1e9e7ec4b3e4c7bb9b014398ea07b7c3f3ae0f21 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 15 Dec 2009 17:21:01 -0800 Subject: [PATCH] math: faster, easier to inline IsNaN, IsInf R=r CC=golang-dev https://golang.org/cl/180046 --- src/pkg/math/bits.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/pkg/math/bits.go b/src/pkg/math/bits.go index 65eabfd6026..9f93a192bf9 100644 --- a/src/pkg/math/bits.go +++ b/src/pkg/math/bits.go @@ -29,8 +29,11 @@ func NaN() float64 { return Float64frombits(uvnan) } // IsNaN returns whether f is an IEEE 754 ``not-a-number'' value. func IsNaN(f float64) (is bool) { - x := Float64bits(f) - return uint32(x>>shift)&mask == mask && x != uvinf && x != uvneginf + // IEEE 754 says that only NaNs satisfy f != f. + // To avoid the floating-point hardware, could use: + // x := Float64bits(f); + // return uint32(x>>shift)&mask == mask && x != uvinf && x != uvneginf + return f != f } // IsInf returns whether f is an infinity, according to sign. @@ -38,8 +41,11 @@ func IsNaN(f float64) (is bool) { // If sign < 0, IsInf returns whether f is negative infinity. // If sign == 0, IsInf returns whether f is either infinity. func IsInf(f float64, sign int) bool { - x := Float64bits(f) - return sign >= 0 && x == uvinf || sign <= 0 && x == uvneginf + // Test for infinity by comparing against maximum float. + // To avoid the floating-point hardware, could use: + // x := Float64bits(f); + // return sign >= 0 && x == uvinf || sign <= 0 && x == uvneginf; + return sign >= 0 && f > MaxFloat64 || sign <= 0 && f < -MaxFloat64 } // Frexp breaks f into a normalized fraction