Source File
remainder.go
Belonging Package
math
// Copyright 2010 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// The original C code and the comment below are from// FreeBSD's /usr/src/lib/msun/src/e_remainder.c and came// with this notice. The go code is a simplified version of// the original C.//// ====================================================// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.//// Developed at SunPro, a Sun Microsystems, Inc. business.// Permission to use, copy, modify, and distribute this// software is freely granted, provided that this notice// is preserved.// ====================================================//// __ieee754_remainder(x,y)// Return :// returns x REM y = x - [x/y]*y as if in infinite// precision arithmetic, where [x/y] is the (infinite bit)// integer nearest x/y (in half way cases, choose the even one).// Method :// Based on Mod() returning x - [x/y]chopped * y exactly.// Remainder returns the IEEE 754 floating-point remainder of x/y.//// Special cases are:// Remainder(±Inf, y) = NaN// Remainder(NaN, y) = NaN// Remainder(x, 0) = NaN// Remainder(x, ±Inf) = x// Remainder(x, NaN) = NaNfunc (, float64) float64func (, float64) float64 {const (= 4.45014771701440276618e-308 // 0x0020000000000000= MaxFloat64 / 2)// special casesswitch {case IsNaN() || IsNaN() || IsInf(, 0) || == 0:return NaN()case IsInf(, 0):return}:= falseif < 0 {= -= true}if < 0 {= -}if == {if {:= 0.0return -}return 0}if <= {= Mod(, +) // now x < 2y}if < {if + > {-=if + >= {-=}}} else {:= 0.5 *if > {-=if >= {-=}}}if {= -}return}