mod.go 696 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package math32
  2. // Mod returns the floating-point remainder of x/y.
  3. // The magnitude of the result is less than y and its
  4. // sign agrees with that of x.
  5. //
  6. // Special cases are:
  7. // Mod(±Inf, y) = NaN
  8. // Mod(NaN, y) = NaN
  9. // Mod(x, 0) = NaN
  10. // Mod(x, ±Inf) = x
  11. // Mod(x, NaN) = NaN
  12. func Mod(x, y float32) float32 {
  13. return mod(x, y)
  14. }
  15. func mod(x, y float32) float32 {
  16. if y == 0 || IsInf(x, 0) || IsNaN(x) || IsNaN(y) {
  17. return NaN()
  18. }
  19. if y < 0 {
  20. y = -y
  21. }
  22. yfr, yexp := Frexp(y)
  23. sign := false
  24. r := x
  25. if x < 0 {
  26. r = -x
  27. sign = true
  28. }
  29. for r >= y {
  30. rfr, rexp := Frexp(r)
  31. if rfr < yfr {
  32. rexp = rexp - 1
  33. }
  34. r = r - Ldexp(y, rexp-yexp)
  35. }
  36. if sign {
  37. r = -r
  38. }
  39. return r
  40. }