Black Lives Matter. Support the Equal Justice Initiative.

# Source file src/math/remainder.go

## Documentation: math

```     1  // Copyright 2010 The Go Authors. All rights reserved.
2  // Use of this source code is governed by a BSD-style
4
5  package math
6
7  // The original C code and the comment below are from
8  // FreeBSD's /usr/src/lib/msun/src/e_remainder.c and came
9  // with this notice. The go code is a simplified version of
10  // the original C.
11  //
12  // ====================================================
14  //
15  // Developed at SunPro, a Sun Microsystems, Inc. business.
16  // Permission to use, copy, modify, and distribute this
17  // software is freely granted, provided that this notice
18  // is preserved.
19  // ====================================================
20  //
21  // __ieee754_remainder(x,y)
22  // Return :
23  //      returns  x REM y  =  x - [x/y]*y  as if in infinite
24  //      precision arithmetic, where [x/y] is the (infinite bit)
25  //      integer nearest x/y (in half way cases, choose the even one).
26  // Method :
27  //      Based on Mod() returning  x - [x/y]chopped * y  exactly.
28
29  // Remainder returns the IEEE 754 floating-point remainder of x/y.
30  //
31  // Special cases are:
32  //	Remainder(±Inf, y) = NaN
33  //	Remainder(NaN, y) = NaN
34  //	Remainder(x, 0) = NaN
35  //	Remainder(x, ±Inf) = x
36  //	Remainder(x, NaN) = NaN
37  func Remainder(x, y float64) float64
38
39  func remainder(x, y float64) float64 {
40  	const (
41  		Tiny    = 4.45014771701440276618e-308 // 0x0020000000000000
42  		HalfMax = MaxFloat64 / 2
43  	)
44  	// special cases
45  	switch {
46  	case IsNaN(x) || IsNaN(y) || IsInf(x, 0) || y == 0:
47  		return NaN()
48  	case IsInf(y, 0):
49  		return x
50  	}
51  	sign := false
52  	if x < 0 {
53  		x = -x
54  		sign = true
55  	}
56  	if y < 0 {
57  		y = -y
58  	}
59  	if x == y {
60  		if sign {
61  			zero := 0.0
62  			return -zero
63  		}
64  		return 0
65  	}
66  	if y <= HalfMax {
67  		x = Mod(x, y+y) // now x < 2y
68  	}
69  	if y < Tiny {
70  		if x+x > y {
71  			x -= y
72  			if x+x >= y {
73  				x -= y
74  			}
75  		}
76  	} else {
77  		yHalf := 0.5 * y
78  		if x > yHalf {
79  			x -= y
80  			if x >= yHalf {
81  				x -= y
82  			}
83  		}
84  	}
85  	if sign {
86  		x = -x
87  	}
88  	return x
89  }
90
```

View as plain text