1 // Copyright 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.
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
12 // ====================================================
13 // Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
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
19 // ====================================================
21 // __ieee754_remainder(x,y)
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).
27 // Based on Mod() returning x - [x/y]chopped * y exactly.
29 // Remainder returns the IEEE 754 floating-point remainder of x/y.
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 return remainder(x
, y
)
41 func remainder(x
, y
float64) float64 {
43 Tiny
= 4.45014771701440276618e-308 // 0x0020000000000000
44 HalfMax
= MaxFloat64
/ 2
48 case IsNaN(x
) ||
IsNaN(y
) ||
IsInf(x
, 0) || y
== 0:
65 x
= Mod(x
, y
+y
) // now x < 2y