aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/math/modf.v
blob: bac08bf0de065b301fabdc206ead7383c3d5fe37 (plain)
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
module math

const (
	modf_maxpowtwo = 4.503599627370496000e+15
)

// 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
pub fn modf(f f64) (f64, f64) {
	abs_f := abs(f)
	mut i := 0.0
	if abs_f >= math.modf_maxpowtwo {
		i = f // it must be an integer
	} else {
		i = abs_f + math.modf_maxpowtwo // shift fraction off right
		i -= math.modf_maxpowtwo // shift back without fraction
		for i > abs_f { // above arithmetic might round
			i -= 1.0 // test again just to be sure
		}
		if f < 0.0 {
			i = -i
		}
	}
	return i, f - i // signed fractional part
}