| // Copyright 2009 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 | |
| /* | |
| * floating-point mod func without infinity or NaN checking | |
| */ | |
| export func | |
| fmod(x, y float64) float64 | |
| { | |
| var yexp, rexp int; | |
| var r, yfr, rfr float64; | |
| var sign bool; | |
| if y == 0 { | |
| return x; | |
| } | |
| if y < 0 { | |
| y = -y; | |
| } | |
| yfr,yexp = sys.frexp(y); | |
| sign = false; | |
| if x < 0 { | |
| r = -x; | |
| sign = true; | |
| } else { | |
| r = x; | |
| } | |
| for r >= y { | |
| rfr,rexp = sys.frexp(r); | |
| if rfr < yfr { | |
| rexp = rexp - 1; | |
| } | |
| r = r - sys.ldexp(y, rexp-yexp); | |
| } | |
| if sign { | |
| r = -r; | |
| } | |
| return r; | |
| } |