Source File
floor.go
Belonging Package
math
// Copyright 2009 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 math// Floor returns the greatest integer value less than or equal to x.//// Special cases are:// Floor(±0) = ±0// Floor(±Inf) = ±Inf// Floor(NaN) = NaNfunc ( float64) float64func ( float64) float64 {if == 0 || IsNaN() || IsInf(, 0) {return}if < 0 {, := Modf(-)if != 0.0 {= + 1}return -}, := Modf()return}// Ceil returns the least integer value greater than or equal to x.//// Special cases are:// Ceil(±0) = ±0// Ceil(±Inf) = ±Inf// Ceil(NaN) = NaNfunc ( float64) float64func ( float64) float64 {return -Floor(-)}// Trunc returns the integer value of x.//// Special cases are:// Trunc(±0) = ±0// Trunc(±Inf) = ±Inf// Trunc(NaN) = NaNfunc ( float64) float64func ( float64) float64 {if == 0 || IsNaN() || IsInf(, 0) {return}, := Modf()return}// Round returns the nearest integer, rounding half away from zero.//// Special cases are:// Round(±0) = ±0// Round(±Inf) = ±Inf// Round(NaN) = NaNfunc ( float64) float64 {// Round is a faster implementation of://// func Round(x float64) float64 {// t := Trunc(x)// if Abs(x-t) >= 0.5 {// return t + Copysign(1, x)// }// return t// }:= Float64bits():= uint(>>shift) & maskif < bias {// Round abs(x) < 1 including denormals.&= signMask // +-0if == bias-1 {|= uvone // +-1}} else if < bias+shift {// Round any abs(x) >= 1 containing a fractional component [0,1).//// Numbers with larger exponents are returned unchanged since they// must be either an integer, infinity, or NaN.const = 1 << (shift - 1)-= bias+= >>&^= fracMask >>}return Float64frombits()}// RoundToEven returns the nearest integer, rounding ties to even.//// Special cases are:// RoundToEven(±0) = ±0// RoundToEven(±Inf) = ±Inf// RoundToEven(NaN) = NaNfunc ( float64) float64 {// RoundToEven is a faster implementation of://// func RoundToEven(x float64) float64 {// t := math.Trunc(x)// odd := math.Remainder(t, 2) != 0// if d := math.Abs(x - t); d > 0.5 || (d == 0.5 && odd) {// return t + math.Copysign(1, x)// }// return t// }:= Float64bits():= uint(>>shift) & maskif >= bias {// Round abs(x) >= 1.// - Large numbers without fractional components, infinity, and NaN are unchanged.// - Add 0.499.. or 0.5 before truncating depending on whether the truncated// number is even or odd (respectively).const = (1 << (shift - 1)) - 1-= bias+= ( + (>>(shift-))&1) >>&^= fracMask >>} else if == bias-1 && &fracMask != 0 {// Round 0.5 < abs(x) < 1.= &signMask | uvone // +-1} else {// Round abs(x) <= 0.5 including denormals.&= signMask // +-0}return Float64frombits()}