선수로 산다, 때론 좋은 코치로

[golang] A Tour of Go - 48 연습 문제 본문

개발 관련/go

[golang] A Tour of Go - 48 연습 문제

godsman 2018. 2. 12. 20:57

[golang] A Tour of Go - 48 연습 문제

https://go-tour-kr.appspot.com/#48

complex64 타입과 complex128 타입을 통해서 Go 언어의 복소수 지원 기능을 알아봅니다. 세제곱근을 얻기 위해서는, 뉴턴의 방법 (Newton's method)을 적용하여 다음을 반복 수행합니다:

z = z - (z * z * z - x) / (3 * z * z)

알고리즘이 잘 동작하는지 확인하기 위해 2의 세제곱근을 구해봅시다. math/cmplx 패키지에는 Pow 함수가 있습니다.

뉴턴의 방법은 반복이 필요하므로 for 문 활용해서 10번 반복실행합니다.

    for i:=0; i<10; i++ {

z = z - (z * z * z -x) / (3 * z * z)

fmt.Println(z)

    }

math/cmplx 패키지에서 제공하는 Pow 함수를 이용하여 검산합니다. z를 3제곱해서 원래 값인 2가 나오는지 확인합니다.

fmt.Println(cmplx.Pow(z, 3))

간단하게 완성된 소스입니다. 

package main

import "fmt"
import "math/cmplx"

func Cbrt(x complex128) complex128 {
var z complex128 = 1. //z의 초기값 1로 설정
for i:=0; i<10; i++ {
        z = z - (z * z * z -x) / (3 * z * z)
        fmt.Println(z)
}

fmt.Println(cmplx.Pow(z, 3))
return z
}

func main() {
fmt.Println(Cbrt(2))
}


실행하면, 5번만에 근사값을 구합니다. 근사값을 세제곱하면 2+0i 즉, 2가 되는 걸 알 수 있습니다.

(1.3333333333333333+0i)

(1.2638888888888888+0i)

(1.259933493449977+0i)

(1.2599210500177698+0i)

(1.2599210498948732+0i)

(1.2599210498948732+0i)

...

(2+0i)

(1.2599210498948732+0i)


뉴턴의 제곱근, 세제곱근 구하는 공식이 궁금합니다.


Comments