github.com/anakojm/hugo-katex@v0.0.0-20231023141351-42d6f5de9c0b/tpl/math/round.go (about)

     1  // Copyright 2009 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  // According to https://github.com/golang/go/issues/20100, the Go stdlib will
     6  // include math.Round beginning with Go 1.10.
     7  //
     8  // The following implementation was taken from https://golang.org/cl/43652.
     9  
    10  package math
    11  
    12  import "math"
    13  
    14  const (
    15  	mask  = 0x7FF
    16  	shift = 64 - 11 - 1
    17  	bias  = 1023
    18  )
    19  
    20  // Round returns the nearest integer, rounding half away from zero.
    21  //
    22  // Special cases are:
    23  //
    24  //	Round(±0) = ±0
    25  //	Round(±Inf) = ±Inf
    26  //	Round(NaN) = NaN
    27  func _round(x float64) float64 {
    28  	// Round is a faster implementation of:
    29  	//
    30  	//	func Round(x float64) float64 {
    31  	//		t := Trunc(x)
    32  	//		if Abs(x-t) >= 0.5 {
    33  	//			return t + Copysign(1, x)
    34  	//		}
    35  	//		return t
    36  	//	}
    37  	const (
    38  		signMask = 1 << 63
    39  		fracMask = 1<<shift - 1
    40  		half     = 1 << (shift - 1)
    41  		one      = bias << shift
    42  	)
    43  
    44  	bits := math.Float64bits(x)
    45  	e := uint(bits>>shift) & mask
    46  	if e < bias {
    47  		// Round abs(x) < 1 including denormals.
    48  		bits &= signMask // +-0
    49  		if e == bias-1 {
    50  			bits |= one // +-1
    51  		}
    52  	} else if e < bias+shift {
    53  		// Round any abs(x) >= 1 containing a fractional component [0,1).
    54  		//
    55  		// Numbers with larger exponents are returned unchanged since they
    56  		// must be either an integer, infinity, or NaN.
    57  		e -= bias
    58  		bits += half >> e
    59  		bits &^= fracMask >> e
    60  	}
    61  	return math.Float64frombits(bits)
    62  }