// 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 import "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; }