| // Copyright 2017 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 |
| |
| import "unsafe" |
| |
| var inf = float64frombits(0x7FF0000000000000) |
| |
| // isNaN reports whether f is an IEEE 754 ``not-a-number'' value. |
| func isNaN(f float64) (is bool) { |
| // IEEE 754 says that only NaNs satisfy f != f. |
| return f != f |
| } |
| |
| // isFinite reports whether f is neither NaN nor an infinity. |
| func isFinite(f float64) bool { |
| return !isNaN(f - f) |
| } |
| |
| // isInf reports whether f is an infinity. |
| func isInf(f float64) bool { |
| return !isNaN(f) && !isFinite(f) |
| } |
| |
| // Abs returns the absolute value of x. |
| // |
| // Special cases are: |
| // Abs(±Inf) = +Inf |
| // Abs(NaN) = NaN |
| func abs(x float64) float64 { |
| const sign = 1 << 63 |
| return float64frombits(float64bits(x) &^ sign) |
| } |
| |
| // copysign returns a value with the magnitude |
| // of x and the sign of y. |
| func copysign(x, y float64) float64 { |
| const sign = 1 << 63 |
| return float64frombits(float64bits(x)&^sign | float64bits(y)&sign) |
| } |
| |
| // Float64bits returns the IEEE 754 binary representation of f. |
| func float64bits(f float64) uint64 { |
| return *(*uint64)(unsafe.Pointer(&f)) |
| } |
| |
| // Float64frombits returns the floating point number corresponding |
| // the IEEE 754 binary representation b. |
| func float64frombits(b uint64) float64 { |
| return *(*float64)(unsafe.Pointer(&b)) |
| } |