|  | // 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 | 
|  |  | 
|  | // 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 float64) (int float64, frac float64) { | 
|  | if haveArchModf { | 
|  | return archModf(f) | 
|  | } | 
|  | return modf(f) | 
|  | } | 
|  |  | 
|  | func modf(f float64) (int float64, frac float64) { | 
|  | 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 := Float64bits(f) | 
|  | e := uint(x>>shift)&mask - bias | 
|  |  | 
|  | // Keep the top 12+e bits, the integer part; clear the rest. | 
|  | if e < 64-12 { | 
|  | x &^= 1<<(64-12-e) - 1 | 
|  | } | 
|  | int = Float64frombits(x) | 
|  | frac = f - int | 
|  | return | 
|  | } |