| // 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 | |
| import "math" | |
| /* | |
| * floating-point mod func without infinity or NaN checking | |
| */ | |
| // Fmod returns the floating-point remainder of x/y. | |
| func Fmod(x, y float64) float64 { | |
| if y == 0 { | |
| return x; | |
| } | |
| if y < 0 { | |
| y = -y; | |
| } | |
| yfr, yexp := Frexp(y); | |
| sign := false; | |
| r := x; | |
| if x < 0 { | |
| r = -x; | |
| sign = true; | |
| } | |
| for r >= y { | |
| rfr, rexp := Frexp(r); | |
| if rfr < yfr { | |
| rexp = rexp - 1; | |
| } | |
| r = r - Ldexp(y, rexp-yexp); | |
| } | |
| if sign { | |
| r = -r; | |
| } | |
| return r; | |
| } |