| // 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 |
| } |