1 // Copyright 2017 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 5 package runtime
6 7 import "unsafe"
8 9 var inf = float64frombits(0x7FF0000000000000)
10 11 // isNaN reports whether f is an IEEE 754 “not-a-number” value.
12 func isNaN(f float64) (is bool) {
13 // IEEE 754 says that only NaNs satisfy f != f.
14 return f != f
15 }
16 17 // isFinite reports whether f is neither NaN nor an infinity.
18 func isFinite(f float64) bool {
19 return !isNaN(f - f)
20 }
21 22 // isInf reports whether f is an infinity.
23 func isInf(f float64) bool {
24 return !isNaN(f) && !isFinite(f)
25 }
26 27 // Abs returns the absolute value of x.
28 //
29 // Special cases are:
30 //
31 // Abs(±Inf) = +Inf
32 // Abs(NaN) = NaN
33 func abs(x float64) float64 {
34 const sign = 1 << 63
35 return float64frombits(float64bits(x) &^ sign)
36 }
37 38 // copysign returns a value with the magnitude
39 // of x and the sign of y.
40 func copysign(x, y float64) float64 {
41 const sign = 1 << 63
42 return float64frombits(float64bits(x)&^sign | float64bits(y)&sign)
43 }
44 45 // Float64bits returns the IEEE 754 binary representation of f.
46 func float64bits(f float64) uint64 {
47 return *(*uint64)(unsafe.Pointer(&f))
48 }
49 50 // Float64frombits returns the floating point number corresponding
51 // the IEEE 754 binary representation b.
52 func float64frombits(b uint64) float64 {
53 return *(*float64)(unsafe.Pointer(&b))
54 }
55