Home | History | Annotate | Download | only in math
      1 // Copyright 2009-2010 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 math
      6 
      7 /*
      8 	Floating-point mod function.
      9 */
     10 
     11 // Mod returns the floating-point remainder of x/y.
     12 // The magnitude of the result is less than y and its
     13 // sign agrees with that of x.
     14 //
     15 // Special cases are:
     16 //	Mod(Inf, y) = NaN
     17 //	Mod(NaN, y) = NaN
     18 //	Mod(x, 0) = NaN
     19 //	Mod(x, Inf) = x
     20 //	Mod(x, NaN) = NaN
     21 func Mod(x, y float64) float64
     22 
     23 func mod(x, y float64) float64 {
     24 	if y == 0 || IsInf(x, 0) || IsNaN(x) || IsNaN(y) {
     25 		return NaN()
     26 	}
     27 	if y < 0 {
     28 		y = -y
     29 	}
     30 
     31 	yfr, yexp := Frexp(y)
     32 	sign := false
     33 	r := x
     34 	if x < 0 {
     35 		r = -x
     36 		sign = true
     37 	}
     38 
     39 	for r >= y {
     40 		rfr, rexp := Frexp(r)
     41 		if rfr < yfr {
     42 			rexp = rexp - 1
     43 		}
     44 		r = r - Ldexp(y, rexp-yexp)
     45 	}
     46 	if sign {
     47 		r = -r
     48 	}
     49 	return r
     50 }
     51