// 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 | |
/* | |
* sqrt returns the square root of its floating | |
* point argument. Newton's method. | |
* | |
* calls frexp | |
*/ | |
// Sqrt returns the square root of x. | |
// | |
// Special cases are: | |
// Sqrt(+Inf) = +Inf | |
// Sqrt(0) = 0 | |
// Sqrt(x < 0) = NaN | |
func Sqrt(x float64) float64 { | |
if IsInf(x, 1) { | |
return x; | |
} | |
if x <= 0 { | |
if x < 0 { | |
return NaN(); | |
} | |
return 0; | |
} | |
y, exp := Frexp(x); | |
for y < 0.5 { | |
y = y*2; | |
exp = exp-1; | |
} | |
if exp&1 != 0 { | |
y = y*2; | |
exp = exp-1; | |
} | |
temp := 0.5*(1+y); | |
for exp > 60 { | |
temp = temp*float64(1<<30); | |
exp = exp-60; | |
} | |
for exp < -60 { | |
temp = temp/float64(1<<30); | |
exp = exp+60; | |
} | |
if exp >= 0 { | |
exp = 1<<uint(exp/2); | |
temp = temp*float64(exp); | |
} else { | |
exp = 1<<uint(-exp / 2); | |
temp = temp/float64(exp); | |
} | |
for i := 0; i <= 4; i++ { | |
temp = 0.5*(temp + x/temp); | |
} | |
return temp; | |
} |