Svtter
1/5/2017 - 2:49 AM

a solution to https://tour.go-zh.org/methods/9

package main

import (
	"fmt"
)

func Sqrt(x float64) (float64, error) {
	var err ErrNegativeSqrt
	var z float64
	if x < 0 {
		err = ErrNegativeSqrt(x)
		return z, err
	} else {
		z = x
		for i := 0; i < 10; i++ {
			z = z - (z*z-x)/(2*z)
		}
		return z, nil
	}
}

type ErrNegativeSqrt float64

func (e ErrNegativeSqrt) Error() string {
	return fmt.Sprintf("cannot Sqrt negative number: %f", float64(e))
}

func main() {
	fmt.Println(Sqrt(2))
	fmt.Println(Sqrt(-2))
}