30 lines
		
	
	
		
			695 B
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			695 B
		
	
	
	
		
			V
		
	
	
| 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
 | |
| }
 |