-
Notifications
You must be signed in to change notification settings - Fork 22
/
modf.go
35 lines (31 loc) · 706 Bytes
/
modf.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package math32
// Modf returns integer and fractional floating-point numbers
// that sum to f. Both values have the same sign as f.
//
// Special cases are:
// Modf(±Inf) = ±Inf, NaN
// Modf(NaN) = NaN, NaN
func Modf(f float32) (int float32, frac float32) {
return modf(f)
}
func modf(f float32) (int float32, frac float32) {
if f < 1 {
switch {
case f < 0:
int, frac = Modf(-f)
return -int, -frac
case f == 0:
return f, f // Return -0, -0 when f == -0
}
return 0, f
}
x := Float32bits(f)
e := uint(x>>shift)&mask - bias
// Keep the top 9+e bits, the integer part; clear the rest.
if e < 32-9 {
x &^= 1<<(32-9-e) - 1
}
int = Float32frombits(x)
frac = f - int
return
}