Skip to content

Instantly share code, notes, and snippets.

@satyrius
Created October 23, 2013 06:33
Show Gist options
  • Select an option

  • Save satyrius/7113518 to your computer and use it in GitHub Desktop.

Select an option

Save satyrius/7113518 to your computer and use it in GitHub Desktop.
A Tour of Go. Exercise: Errors. Copy your Sqrt function from the earlier exercises and modify it to return an error value. Sqrt should return a non-nil error value when given a negative number, as it doesn't support complex numbers. Create a new type type ErrNegativeSqrt float64 and make it an error by giving it a func (e ErrNegativeSqrt) Error(…
package main
import (
"fmt"
)
type ErrNegativeSqrt float64
func (e ErrNegativeSqrt) Error() string {
return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
}
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, ErrNegativeSqrt(f)
}
z := 1.0
for i := 1; i <= 10; i++ {
z = z - (z * z - f) / (2 * z)
}
return z, nil
}
func main() {
fmt.Println(Sqrt(0.04))
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(4))
fmt.Println(Sqrt(-2))
}
@batic420

Copy link
Copy Markdown
package main

import (
	"fmt"
	"math"
)

type ErrNegativeSqrt float64

func (e ErrNegativeSqrt) Error() string {
	e_fl64 := fmt.Sprint(float64(e))
	return fmt.Sprint("cannot Sqrt negative number: ", e_fl64, "\n")
}

func Sqrt(x float64) (float64, error) {
    z := float64(1)
    var t float64
	
	if x < 0.0 {
		return 0, ErrNegativeSqrt(x)
	}
	
    for {
        z, t = z - (z*z - x) / (2*z), z
		fmt.Println(z, t)
        if math.Abs(t-z) < 1e-8 {
            break
        }
    }
    return z, nil
}

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment