package main import ( "fmt" "math" ) const min_threshold = 1e-200 type ErrNegativeSqrt float64 func (e ErrNegativeSqrt) Error() string { return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e)) } func Sqrt(x float64, threshold float64) (z float64, iterations int, err error) { if x < 0 { err = ErrNegativeSqrt(x) return } z = x old_z := z for { z = z - (z*z-x)/(2*x) if math.Abs(z-old_z) < threshold { break } old_z = z iterations++ } return } func main() { threshold := 1.0 right_answer := math.Sqrt(2) for threshold > min_threshold { answer, iterations, err := Sqrt(2, threshold) if err != nil { panic(err) } fmt.Printf("%0.4g %0.4g %0.20f %0.20f %0.2d\n", threshold, right_answer-answer, right_answer, answer, iterations) threshold = threshold / 10.0 } }