c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

#golang §56 Exercise: Errors

A Tour of Go chapter 56

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() string

method such that ErrNegativeSqrt(-2).Error() returns "cannot Sqrt negative number: -2".
Note: a call to fmt.Print(e) inside the Error method will send the program into an infinite loop. You can avoid this by converting e first: fmt.Print(float64(e)). Why?
Change your Sqrt function to return an ErrNegativeSqrt value when given a negative number.

Example

package main

import (
	"fmt"
	"math"
)

type ErrNegativeSqrt float64

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

func Sqrt(f float64) (float64, error) {
	z := f / 2
	if f < 0 {
		return 0, ErrNegativeSqrt(f)
	}
	var prez float64 = 0
	for math.Abs(z - prez) > 1e-10 {
		prez = z
		z = z - (z * z - f) / (z * 2)
	}
	return z, nil
}

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