* Go 1.2 내려받기

(윈도우즈 용으로는 zip 파일이든 msi 파일이든 아무거나 내려받아 설치해도 된다.)

 

아래에서는 32비트 윈도우 XP 용으로 내려받아 테스트하였다.

Go 1.2 를 폴더 d:\go12 에 설치하였다.

 

* 테스트에 사용된 예제 파일: hello.go

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

 

* Go 1.0.2 를 사용할 때 처럼, 명령(cmd)창을 열고 환경변수 PATH 를 설정한다.

프롬프트> set PATH=d:\go12\bin;%PATH%

 

* go run 멸형으로 hello.go 를 실행한다.

프롬프트> go run hello.go
# command-line-arguments
pack: cannot open $WORK\command-line-arguments\_obj\_go_.8


* 이번에는 -x 옵션을 추가히여 실행해 본다.

프롬프트> go run -x hello.go
WORK=C:\DOCUME~1......\Temp\go-build436098039
mkdir -p $WORK\command-line-arguments\_obj\
mkdir -p $WORK\command-line-arguments\_obj\exe\
cd C:\test\go12
"c:\\go\\pkg\\tool\\windows_386\\8g.exe" -o "......\\Temp\\
go-build436098039\\command-line-arguments\\_obj\\_go_.8" -p command-line-argumen
ts -complete -D _/C_/test/go12 -I "C:\\DOCUME~1\\......\\Temp\\go-build43
6098039" "C:\\test\\go12\\hello.go"
"c:\\go\\pkg\\tool\\windows_386\\pack.exe" grcP "C:\\DOCUME~1\\......\\Te
mp\\go-build436098039" "C:\\DOCUME~1\\......\\Temp\\go-build436098039\\co
mmand-line-arguments.a" "C:\\DOCUME~1\\......\\Temp\\go-build436098039\\c
ommand-line-arguments\\_obj\\_go_.8"
# command-line-arguments
pack: cannot open $WORK\command-line-arguments\_obj\_go_.8

 

* 이번에는 환경변수 GOROOT 를 Go 1.2 가 설치된 폴더로 지정하고 다시 실행해 본다.

프롬프트> set GOROOT=d:\go12

프롬프트> go run hello.go
hello, world

 

* go 가 사용하는 환경변수 알아보기.

프롬프트> go env
set GOARCH=386
set GOBIN=
set GOCHAR=8
set GOEXE=.exe
set GOHOSTARCH=386
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=
set GORACE=
set GOROOT=d:\go12
set GOTOOLDIR=d:\go12\pkg\tool\windows_386
set TERM=dumb
set CC=gcc
set GOGCCFLAGS=-g -O2 -m32 -mthreads
set CXX=g++
set CGO_ENABLED=1

* 이상으로 Go 1.2 를 실행하려면 GOROOT 환경변수가 꼭 필요함을 알 수 있다.

 

 

 

Posted by Scripter
,

 

Go 언어 소스:

/*
 *  Filename: testHexView_02.go
 *
 *  Purpose:  Show Hexadecimal codes of the given binary file.
 *
 *  Execute:  go run testHexView_02.go [filename]
 *
 *  or
 *
 *  Compile:  go build testHexView_02.go
 *  Execute:  ./testHexView_02.go [filename]
 *
 *  Date: 2013. 8. 3.
 */

package main

import (
    "fmt"
    "os"
)

func print(str string) {
    fmt.Printf("%s", str);
}

func println(str string) {
    fmt.Printf("%s\n", str);
}

// 사용법 표시
func printUsage() { 
     println("Usage: go run testHexView_02.go [filename]");
}

func toHex(c int) string {
    var s string = "";
    var x1 int
    var x2 int
    x1 = (c & 0xF0) >> 4;
    x2 = c & 0x0F;
    if x1 < 10 {
        s += fmt.Sprintf("%c", x1 + '0');
    } else {
        s += fmt.Sprintf("%c", (x1 - 10) + 'A');
    }
    if x2 < 10 {
        s += fmt.Sprintf("%c", x2 + '0');
    } else {
        s += fmt.Sprintf("%c", (x2 - 10) + 'A');
    }
    return s
}

func toHex8(n int64) string {
    var s string = "";
    var x1, x2, x3, x4, x5, x6, x7, x8 int64
    x1 = (n & 0xF0000000) >> 28;
    x2 = (n & 0xF000000) >> 24;
    x3 = (n & 0xF00000) >> 20;
    x4 = (n & 0xF0000) >> 16;
    x5 = (n & 0xF000) >> 12;
    x6 = (n & 0xF00) >> 8;
    x7 = (n & 0xF0) >> 4;
    x8 = n & 0x0F;
    if x1 < 10 {
        s += fmt.Sprintf("%c", x1 + '0');
    } else {
        s += fmt.Sprintf("%c", (x1 - 10) + 'A');
    }
    if x2 < 10 {
        s += fmt.Sprintf("%c", x2 + '0');
    } else {
        s += fmt.Sprintf("%c", (x2 - 10) + 'A');
    }
    if x3 < 10 {
        s += fmt.Sprintf("%c", x3 + '0');
    } else {
        s += fmt.Sprintf("%c", (x3 - 10) + 'A');
    }
    if x4 < 10 {
        s += fmt.Sprintf("%c", x4 + '0');
    } else {
        s += fmt.Sprintf("%c", (x4 - 10) + 'A');
    }
    s += " "
    if x5 < 10 {
        s += fmt.Sprintf("%c", x5 + '0');
    } else {
        s += fmt.Sprintf("%c", (x5 - 10) + 'A');
    }
    if x6 < 10 {
        s += fmt.Sprintf("%c", x6 + '0');
    } else {
        s += fmt.Sprintf("%c", (x6 - 10) + 'A');
    }
    if x7 < 10 {
        s += fmt.Sprintf("%c", x7 + '0');
    } else {
        s += fmt.Sprintf("%c", (x7 - 10) + 'A');
    }
    if x8 < 10 {
        s += fmt.Sprintf("%c", x8 + '0');
    } else {
        s += fmt.Sprintf("%c", (x8 - 10) + 'A');
    }
    return s
}


 


// Go 언어의 실행 시작 지점
func main() {
    var i int
    var data []byte
    var fname string
    var fsize int64
    var c byte
    var n int64
    var m int
    var t string

    if len(os.Args) < 2 {
        printUsage()
        return
    }

    fname = os.Args[1]


    file, err := os.Open(fname)
    if err != nil {
        return
    }
    defer file.Close()
   
    // get the file size
    stat, err := file.Stat()
    if err != nil {
        return
    }
    fsize =  stat.Size()

    fmt.Printf("The size of the file \"%s\" is %d.\n\n", fname, fsize)

    for ; n < fsize; {
        fmt.Printf("%s: ", toHex8(n))
        t = ""

        data = make([]byte, 16)
        m, err = file.Read(data)
        if err != nil {
            return
        }

        for i = 0; i < m; i++ {
            c = data[i]
            if i != 7 {
                fmt.Printf(" %s", toHex(int(c)))
            } else {
                fmt.Printf("-%s", toHex(int(c)))
            }
            if c < byte(' ') || c > 0x7F {
                t += "."
            } else {
                t += string(c)
            }
        }
        for i = 0; i < 16 - m; i++ {
            fmt.Printf("   ")
            t += " "
        }
        fmt.Printf("  |%s|\n", t)

        n += int64(m)
    }

    fmt.Printf("\n")
    fmt.Printf("Read %d bytes.\n", n)

    return
}

 

 

실행하기 예 2> go run testHexView_02.go temp_1.bin
The size of the file "temp_1.bin" is 12.

0000 0000:  48 65 6C 6C 6F 20 74-68 65 72 65 0A              |Hello there.    |

Read 12 bytes.

 

실행하기 예 2> go run testHexView_02.go myFile.ser
The size of the file "myFile.ser" is 130.

0000 0000:  AC ED 00 05 73 72 00-06 50 65 72 73 6F 6E 07 31  |....sr..Person.1|
0000 0010:  46 DB A5 1D 44 AB 02-00 03 49 00 03 61 67 65 4C  |F...D....I..ageL|
0000 0020:  00 09 66 69 72 73 74-4E 61 6D 65 74 00 12 4C 6A  |..firstNamet..Lj|
0000 0030:  61 76 61 2F 6C 61 6E-67 2F 53 74 72 69 6E 67 3B  |ava/lang/String;|
0000 0040:  4C 00 08 6C 61 73 74-4E 61 6D 65 71 00 7E 00 01  |L..lastNameq.~..|
0000 0050:  78 70 00 00 00 13 74-00 05 4A 61 6D 65 73 74 00  |xp....t..Jamest.|
0000 0060:  04 52 79 61 6E 73 71-00 7E 00 00 00 00 00 1E 74  |.Ryansq.~......t|
0000 0070:  00 07 4F 62 69 2D 77-61 6E 74 00 06 4B 65 6E 6F  |..Obi-want..Keno|
0000 0080:  62 69                                            |bi              |

Read 130 bytes.

Posted by Scripter
,

음이 아닌 실수 A 의 평방근 sqrt(A) 를 구하는 Heron 의 방법:

        반복함수  g(x) = (x + A/x) / 2   를 이용

 

실수 A 의 n제곱근 root(n, A) 를 구하는 Newton-Raphson 의 방법

        반복함수  g(x) = ((n-1)*x + A/(x**(n - 1))) / n    를 이용

n = 2 인 경우에는 Newton-Raphson 의 방법이 Heron 의 방법과 동일하다.

(참조. http://en.wikipedia.org/wiki/Newton's_method )

 

Go 언어로 프로그래밍을 할 때 import 구문에 "math" 를 추가하고, 소스에서 math.Pow(밑수, 지수) 함수를 사용하여 지수 계산을 할 수 있다. 하지만 차후 필요한 데가 있을 것 같아서 이와 유사한 n 제곱 함수와 n 제곱근 함수를 구현해 보았다.

지수가 정수인 거듭제곱을 계산하는  함수도 nPow(), gPow, mPow() 세 개 구현해 놓았는데, 이들 세 함수는 절차적 언어의 성능상 재귀호출이 아니고 단순 반복 기법을 사용하는 함수이다. 이 세 함수 중 mPow() 의 성능이 가장 우수하다. 큰 지수의 경우 for 반복문의 반복회수를 따져 보면 성능 비교를 할 수 있을 것이다. (성능 비교를 위해 세 가지를 모두 소스에 남겨 두었다.) mPow() 함수는 n 제곱근을 구하는 재귀함수 newtonNthRoot(int, double) 의 구현에 사용되기도 한다. if ... else ... 구문이 많아 소스가 복잡하게 보일지 모르겠으나 이는 밑수나 지수가 음수이거나 0인 경우의 처리를 위함이다. 구현된 모든 함수의 구현에는 예외상황(예를 들어, 음수의 짝수 제곱근 같은 예외상황) 처리 과정이 있다.

Go 언어로 작성된 소스를 실행시키고자 할 때, 옵션 run 을 사용하면 소스 파일을 바로 실행(실제로는 임시 폴더에 바이너리 파일을 생상하여 실행)할 수 있고, 옵션 build 를 사용하면 컴파일하여 실행가능 바이너리 파일을 만든다. (그런데 생성된 실행가능 바이너리 파일의 파일 크기가 꽤 크다. 간단히 Hello 한 즐을 출력하는 소스도 컴파일하면 생성된 실행가능 파일의 크기가 1메가를 넘는다.)

Go 언어에서 float64 라는 타입이 C, C++, Java, C# 에서의 double 타입이라고 하는 것과 동일하다.

Go 언어에서 val 에약어로 선언된 것은 상수이고 var 예약어로 선언된 것은 변수이다. (여기서 상수라 함은 저장된 값을 변경하지 못하는 변수라는 뜻으로 immutable 변수로 이해하면 됨.)

        val a = 1.5   // a 는 상수
        a = 2.7       //  에러

        var b = 1.5   // b 는 변수
        b = 2.7        //  b 에는 새로운 값 2,7 이 저장됨

        c := 2.1   // var c = 2.1 와 동일한 의미

Go 언어는 Java, C# 언어에서의 예외상황 처리를 지원하지 않는다. 그래서 예외상황을 처리하는 편법으로 모든 함수(거듭제곱을 구하는 함수와 거듭제곱근을 구하는 함수)는 리턴할 때 항상 계산된 값과 에러 두 개(소스에서 val 과 err 두 개)를 리턴하도록 하였다. 리턴된 에러가 nil 이면 에외상황이 없는 걸로 갖주된다. 이 때문에 함수의 시용이 번거러운 점은 있다. 예를 들어, 아래의 소스 중에 Main() 함수 내에서

       y, err = newtonCbrt(x)

로 된 것은 세제곱근 함수를 호출하여 err 가 nil 이면 리턴 받은 y 의 값이 유효하고 그렇지 않으면 y 의 값이 유효하지 않다는 뜻이다.

 

// Filename: testNthRoot.go
//
//            Approximate square roots, cubic roots and n-th roots of a given number.
//
// Execute: go run testNthRoot.go
//
//  Or
//
// Cpmpile: go build testNthRoot.go
// Execute: testNthRoot
//
// Date: 2013. 1. 6.
// Copyright (c) 2013 PH Kim  (pkim __AT__ scripts.pe.kr)


package main

import (
    "fmt"
    "math"
    "errors"
)

const (
    MAX_ITER = 20000
    M_EPSILON = 1.0e-15
)


/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
func nPow(a float64, n int) (result float64, error error) {
    if (n > 0) {
        if (n == 1) {
            return a, nil 
        } else {
            if (a == 0.0 || a == 1.0) {
                return a, nil
            } else if (a == -1.0) {
                if (n % 2 == 1) {
                    return -1.0, nil
                } else {
                    return 1.0, nil
                }
            } else if (a < 0.0) {
                if (n % 2 == 1) {
                    val, err := nPow(-a, n)
                    return -val, err
                } else {
                    return nPow(-a, n)
                }
            } else {
                var y = 1.0
                var i int
                for i = 0; i < n; i++ {
                    y *= a
                }
                return y, nil
            }
        }
    } else if (n == 0) {
        return 1.0, nil
    } else {      //  when n < 0
        if (a == 0.0) {
            return -1.0, errors.New("Negative powering exception of zero.")
        } else {
            if (n == -1) {
                return 1.0/a, nil
            } else {
                val, err := nPow(a, -n)
                return 1.0/val, err
            }
        }
    }
    return -1.0, errors.New("No retured value.")
}

 

/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
func gPow(a float64, n int) (result float64, error error) {
    if (n > 0) {
        if (n == 1) {
            return a, nil
        } else {
            if (a == 0.0 || a == 1.0) {
                return a, nil
            } else if (a == -1.0) {
                if (n % 2 == 1) {
                  return -1.0, nil
                } else {
                    return 1.0, nil
                }
            } else if (a < 0.0) {
                if (n % 2 == 1) {
                    val, err := gPow(-a, n)
                    return -val, err
                } else {
                    val, err := gPow(-a, n)
                    return val, err
                }
            } else {
                var y = 1.0
                var r = a
                var m = 8*4 -1      // 8*sizeof(int) - 1;
                var one = 1
                var i int
                for  i = 0; i < m; i++ {
                    if ((n & one) == 0) {
                        y *= 1.0
                    } else {
                        y *= r
                    }
                    r = r*r
                    one <<= 1;
                    if (one > n) {
                        break
                    }
                }
                return y, nil
            }
        }
    } else if (n == 0) {
        return 1.0, nil
    } else {      //  when n < 0
        if (a == 0.0) {
            return -1.0, errors.New("Negative powering exception of zero.")
        } else {
            if (n == -1) {
                return 1.0/a, nil
            } else {
                val, err := gPow(a, -n)
                return 1.0/val, err
            }
        }
    }
    return -1.0, errors.New("No retured value.")
}

 

/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
func mPow(a float64, n int) (result float64, error error) {
    if (n > 0) {
        if (n == 1) {
            return a, nil
        } else {
            if (a == 0.0 || a == 1.0) {
                return a, nil
            } else if (a == -1.0) {
                if (n % 2 == 1) {
                    return -1.0, nil
                } else {
                    return 1.0, nil
                }
            } else if (a < 0.0) {
                if (n % 2 == 1) {
                    val, err := mPow(-a, n)
                    return -val, err
                } else {
                    val, err := mPow(-a, n)
                    return val, err
                }
            } else {
                var y = 1.0
                var r = a
                var m = n
                for ;m > 0; {
                    if ((m & 0x1) != 0) {
                        y *= r
                    }
                    r = r*r
                    m >>= 1
                }
                return y, nil
            }
        }
    } else if (n == 0) {
        return 1.0, nil
    } else {      //  when n < 0
        if (a == 0.0) {
      return -1.0, errors.New("Negative powering exception of zero.")
        } else {
            if (n == -1) {
                return 1.0/a, nil
            } else {
                val, err := mPow(a, -n)
                return 1.0/val, err
            }
        }
     }
    return -1.0, errors.New("No retured value.")
}

 

/**
  * Compute the square root of x to a given scale, x > 0.
  */
func heronSqrt(a float64) (result float64, error error) {
    if (a < 0.0) {
        return -1.0, errors.New("Cannot find the sqrt of a negative number.")
    } else if (a == 0.0 || a == 1.0) {
        return a, nil
    } else {
        var x1 = a
        var x2 = (x1 + a/x1)/2.0
        var er = x1 - x2
        var counter int = 0
        for ;(x1 + er != x1); {
            x1 = x2
            x2 = (x1 + a/x1)/2.0
            er = x1 - x2
            if (math.Abs(er) < math.Abs(M_EPSILON*x1)) {
                break
            }
            counter++
            if (counter > MAX_ITER) {
                break
            }
        }
        if (counter >= MAX_ITER) {
            return -1.0, errors.New("Inaccurate sqrt exception by too many iterations.")
        }
        return x2, nil
    }
    return -1.0, errors.New("No retured value.")
 }

/**
  * Compute the cubic root of x to a given scale, x > 0.
  */
func newtonCbrt(a float64) (result float64, error error) {
    if (a == 0.0 || a == 1.0 || a == -1.0) {
        return a, nil
    } else if (a < 0.0) {
        val, err := newtonCbrt(-a)
        return -val, err
    } else {
        var x1 = a
        var x2 = (2.0*x1 + a/(x1*x1))/3.0
        var er = x1 - x2;
        var counter int = 0
        for ;(x1 + er != x1); {
            x1 = x2
            x2 = (2.0*x1 + a/(x1*x1))/3.0
            er = x1 - x2
            if (math.Abs(er) < math.Abs(M_EPSILON*x1)) {
                break
            }
            counter++
            if (counter > MAX_ITER) {
                break
            }
        }
        if (counter >= MAX_ITER) {
            return -1.0, errors.New("Inaccurate cbrt exception by too many iterations.")
        }
        return x2, nil
    }
    return -1.0, errors.New("No retured value.")
}


/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
func newtonNthRoot(n int, a float64) (result float64, error error) {
    if (n == 0) {
        return 1.0, nil
    } else if (n == 1) {
        return a, nil
    } else if (n > 0) {
        if (a == 0.0 || a == 1.0) {
      return a, nil
        } else if (a == -1.0) {
            if (n % 2 == 1) {
                return a, nil
            } else {
                return -1.0, errors.New("Cannot find the even n-th root of a negative number.")
            }
        }else if (a < 0.0) {
            if (n % 2 == 1) {
                val, err := newtonNthRoot(n, -a)
                return -val, err
            } else {
                return -1.0, errors.New("Cannot find the even n-th root of a negative number.")
            }
        } else if (a < 1.0) {
            val, err := newtonNthRoot(n, 1.0/a)
            return 1.0/val, err
        } else {
            var x1 = a
            var xn, err = mPow(x1, n - 1)
            if err != nil {
                return -1.0, err
            }
            var x2 = (float64(n - 1) *x1 + a/xn)/float64(n)
            var er = x1 - x2
            var counter int= 0
            for ;(x1 + er != x1); {
                x1 = x2;
                xn, err = mPow(x1, n - 1)
                if err != nil {
                    return -1.0, err
                }
                x2 = (float64(n - 1)*x1 + a/xn)/float64(n)
                er = x1 - x2
                if (math.Abs(er) < math.Abs(M_EPSILON*x1)) {
                    break
                }
                counter++
                if (counter > MAX_ITER) {
                    break
                }
            }
            if (counter >= MAX_ITER) {
                return -1.0, errors.New("Inaccurate n-th root exception by too many iterations.")
            }
            return x2, nil
        }
    } else {
        if (a == 0.0) {
            return -1.0, errors.New("Cannot find the negative n-th root of zero.")
        } else {
            val, err := newtonNthRoot(-n, a)
            return 1.0/val, err
        }
    }
    return -1.0, errors.New("No retured value.")
}

 

func main() {
    x := 16.0
    u := math.Sqrt(x)

    fmt.Printf("[ Testing heronSqrt(double) ]--------------------\n")
    fmt.Printf("x = %g\n", x)
    fmt.Printf("u = sqrt(%g) = %g\n", x, u)

    var y, err = heronSqrt(x)
    if (err == nil) {
        fmt.Printf("y = heronSqrt(%g) = %g\n", x,  y)
        fmt.Printf("y*y = %g\n", y*y)
        fmt.Printf("\n");
    }

    fmt.Printf("[ Testing newtonCbrt(double) ]--------------------\n")
    x = -216.0
    fmt.Printf("x = %g\n", x)
    fmt.Printf("-exp(log(-x)/3.0) = %g\n", -math.Exp(math.Log(-x)/3.0))
    var w float64
    w, err = newtonCbrt(x)
    if (err == nil) {
        fmt.Printf("w = newtonCbrt(%g) = %g\n", x, w)
        fmt.Printf("w*w*w = %g\n", w*w*w);
    }
    fmt.Printf("\n");

    x = 729000000000.0
    fmt.Printf("x = %g\n", x)
    fmt.Printf("exp(log(x)/3.0) = %g\n", math.Exp(math.Log(x)/3.0))
    w, err = newtonCbrt(x)
    if (err == nil) {
        fmt.Printf("w = newtonCbrt(%g) = %g\n", x, w)
        fmt.Printf("w*w*w = %g\n", w*w*w);
    }
    fmt.Printf("\n");

    fmt.Printf("[ Testing newtonNthRoot(int, double) ]--------------------\n");
    var z float64
    z, err = newtonNthRoot(3, x)
    fmt.Printf("x = %g\n", x)
    if (err == nil) {
        fmt.Printf("z = newtonNthRoot(3, %g) = %g\n", x, z)
        fmt.Printf("z*z*z = %g\n", z*z*z);
    }
    fmt.Printf("\n");

    x = 12960000000000000000.0
    z, err = newtonNthRoot(4, x)
    fmt.Printf("x = %g\n", x)
    if (err == nil) {
        fmt.Printf("z = newtonNthRoot(4, %g) = %g\n", x, z)
        fmt.Printf("z*z*z*z = %g\n", z*z*z*z);
    }
    fmt.Printf("\n");

    x = 1.0/12960000000000000000.0
    z, err = newtonNthRoot(4, x)
    fmt.Printf("x = %g\n", x)
    if (err == nil) {
        fmt.Printf("exp(log(x)/4.0) = %g\n", math.Exp(math.Log(x)/4.0))
        fmt.Printf("z = newtonNthRoot(4, x) = newtonNthRoot(4, %g) = %g\n", x, z)
        fmt.Printf("z*z*z*z = %g\n", z*z*z*z);
    }
    fmt.Printf("\n");


    x = -4.0
    fmt.Printf("[ Test Exception heronSqrt(double) ]--------------------\n")
    fmt.Printf("x = %g\n", x)
    fmt.Printf("Calculating heronSqrt(%g)\n", x)
    y, err = heronSqrt(x)
    if (err == nil) {
        fmt.Printf("y = heronSqrt(%g) = %g\n", x, z)
        fmt.Printf("y*y = %g\n", y*y);
    } else {
        fmt.Printf("%s\nCaught some exception in calculating heronSqrt(%g)\n", err, x)
    }
    fmt.Printf("\n");

    x = -4.0
    fmt.Printf("[ Test Exception in newtonCbrt(double) ]--------------------\n")
    fmt.Printf("x = %g\n", x)
    fmt.Printf("Calculating newtonCbrt(%g)\n", x)
    y, err = newtonCbrt(x)
    if (err == nil) {
        fmt.Printf("y = newtonCbrt(%g) = %g\n", x, z)
        fmt.Printf("y*y*y = %g\n", y*y*y);
    } else {
        fmt.Printf("%s\nCaught some exception in calculating newtonCbrt(%g)\n", err, x)
    }
    fmt.Printf("\n");


    fmt.Printf("[ Test calculations by powering ]-----------------------------\n")
    x = 200.0
    z, err = newtonNthRoot(10, x)
    fmt.Printf("x = %g\n", x)
    if (err == nil) {
        fmt.Printf("exp(log(x)/10.0) = %g\n", math.Exp(math.Log(x)/10.0))
        fmt.Printf("z = newtonNthRoot(10, x) = newtonNthRoot(10, %g) = %g\n", x, z)
        fmt.Printf("pow(z, 10) = %g\n", math.Pow(z, 10));
    }
    fmt.Printf("\n");

    x = 3001.0
    z, err = newtonNthRoot(99, x)
    fmt.Printf("x = %g\n", x)
    if (err == nil) {
        fmt.Printf("exp(log(x)/99.0) = %g\n", math.Exp(math.Log(x)/99.0))
        fmt.Printf("z = newtonNthRoot(99, x) = newtonNthRoot(99, %g) = %g\n", x, z)
        fmt.Printf("pow(z, 99) = %g\n", math.Pow(z, 99));
    }
    fmt.Printf("\n");

    x = 3001.0
    z, err = newtonNthRoot(-99, x)
    fmt.Printf("x = %g\n", x)
    if (err == nil) {
        fmt.Printf("exp(log(x)/-99.0) = %g\n", math.Exp(math.Log(x)/-99.0))
        fmt.Printf("z = newtonNthRoot(-99, x) = newtonNthRoot(-99, %g) = %g\n", x, z)
        fmt.Printf("1.0/pow(z, 99) = = %g\n", 1.0/math.Pow(z, 99));
    }
    fmt.Printf("\n");


    fmt.Printf("2.1**2.1 = pow(2.1, 2.1) = %g\n", math.Pow(2.1, 2.1))
    fmt.Printf("2.1**(-2.1) = pow(2.1, -2.1) = %g\n" , math.Pow(2.1, -2.1))
    fmt.Printf("2.1**2.1 * 2.1**(-2.1) = pow(2.1, 2.1) * pow(2.1, -2.1) = %g\n", math.Pow(2.1, 2.1)*math.Pow(2.1, -2.1))
    fmt.Printf("2.1**2.1 = exp(2.1*log(2.1)) = %g\n", math.Exp(2.1*math.Log(2.1)))
    fmt.Printf("2.1**(-2.1) = exp(-2.1*log(2.1)) = %g\n", math.Exp(-2.1*math.Log(2.1)))
    fmt.Printf("2.1**2.1 * 2.1**(-2.1) = exp(2.1*log(2.1)) * exp(-2.1*log(2.1)) = %g\n", math.Exp(2.1*math.Log(2.1)) * math.Exp(-2.1*math.Log(2.1)))
    fmt.Printf("\n");

    fmt.Printf("Done.\n")
}

/*
Output:
[ Testing heronSqrt(double) ]--------------------
x = 16
u = sqrt(16) = 4
y = heronSqrt(16) = 4
y*y = 16

[ Testing newtonCbrt(double) ]--------------------
x = -216
-exp(log(-x)/3.0) = -6.000000000000002
w = newtonCbrt(-216) = -6
w*w*w = -216

x = 7.29e+11
exp(log(x)/3.0) = 8999.999999999998
w = newtonCbrt(7.29e+11) = 9000
w*w*w = 7.29e+11

[ Testing newtonNthRoot(int, double) ]--------------------
x = 7.29e+11
z = newtonNthRoot(3, 7.29e+11) = 9000
z*z*z = 7.29e+11

x = 1.296e+19
z = newtonNthRoot(4, 1.296e+19) = 60000
z*z*z*z = 1.296e+19

x = 7.716049382716049e-20
exp(log(x)/4.0) = 1.6666666666666654e-05
z = newtonNthRoot(4, x) = newtonNthRoot(4, 7.716049382716049e-20) = 1.6666666666
666667e-05
z*z*z*z = 7.716049382716051e-20

[ Test Exception heronSqrt(double) ]--------------------
x = -4
Calculating heronSqrt(-4)
Cannot find the sqrt of a negative number.
Caught some exception in calculating heronSqrt(-4)

[ Test Exception in newtonCbrt(double) ]--------------------
x = -4
Calculating newtonCbrt(-4)
y = newtonCbrt(-4) = 1.6666666666666667e-05
y*y*y = -3.999999999999999

[ Test calculations by powering ]-----------------------------
x = 200
exp(log(x)/10.0) = 1.6986464646342474
z = newtonNthRoot(10, x) = newtonNthRoot(10, 200) = 1.6986464646342472
pow(z, 10) = 199.9999999999999

x = 3001
exp(log(x)/99.0) = 1.0842361893258805
z = newtonNthRoot(99, x) = newtonNthRoot(99, 3001) = 1.0842361893258805
pow(z, 99) = 3000.9999999999873

x = 3001
exp(log(x)/-99.0) = 0.9223082662659932
z = newtonNthRoot(-99, x) = newtonNthRoot(-99, 3001) = 0.9223082662659932
1.0/pow(z, 99) = = 3001.0000000000077

2.1**2.1 = pow(2.1, 2.1) = 4.749638091742242
2.1**(-2.1) = pow(2.1, -2.1) = 0.21054235726688478
2.1**2.1 * 2.1**(-2.1) = pow(2.1, 2.1) * pow(2.1, -2.1) = 1
2.1**2.1 = exp(2.1*log(2.1)) = 4.749638091742241
2.1**(-2.1) = exp(-2.1*log(2.1)) = 0.2105423572668848
2.1**2.1 * 2.1**(-2.1) = exp(2.1*log(2.1)) * exp(-2.1*log(2.1)) = 1

Done.
*/

 

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Go 언어에서는 math.Asin() 함수로 구현되어 있다.

/*
 * Filename: testArcSine.go
 *
 * Execute: go run testArcSine.go
 *
 *  Or
 *
 * Compile: go build testArcSine.go
 * Execute: testArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */
 
package main

import (
    "fmt"
    "math"
)

func asinh(x float64) float64 {
    y := math.Log(x + math.Sqrt(x*x + 1))
    return y
}

func acosh(x float64) float64 {
    y := math.Log(x + math.Sqrt(x*x - 1))
    return y
}

func main() {
 
    x := -0.9
    y := math.Asin(x)
    fmt.Printf("y = asin(%g) = %.9f\n", x, y)
    fmt.Printf("sin(y) = sin(%.9f) = %g\n", y, math.Sin(y))
    fmt.Printf("\n")

    x = 1.1
    u := acosh(x)
    fmt.Printf("u = acosh(%g) = %.10f\n", x, u)
 
    v := asinh(x)
    fmt.Printf("v = asinh(%g) = %.10f\n", x, v)
 
    fmt.Printf("cosh(u) = cosh(%.10f) = %g\n", u, math.Cosh(u))
    fmt.Printf("sinh(v) = sinh(%.10f) = %g\n", v, math.Sinh(v))
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

 

Posted by Scripter
,

Go 언어의 int64 타입은 C 언어의 long long 터입처럼 64비트 부호 았는 정수 타입이다. 이 타입으로는 20! 까지만 정확하게 게산된다. (Go 언어의 int64 타입으로 계산 가능한 최대 팩토리얼은?  참조) 하지만 Go 언어의 "math/big" 패키지를 사용하면 (C 언어의 GMP 라이브러리를 쓰는 것 처럼) 무제한 자리수의 정수 계산이 가능하다.

다음 소스는 C 언어로 GMP 라이브러리를 이용하여 30! 까지 정확하게 계산하기의 C 언어 소스 recFactGMP01.c를 Go 언어용으로 수정한 것이다.



* 소스 파일명: recBigFact01.go

/*
 *  Filename: recBigFact01.go
 *
 *  Execute: go run recBigFact01.go
 *
 *  or
 *
 *  Compile: go build recBigFact01.go
 *  Execute: ./recBigFact01
 */

package main

import (
    "fmt"
    "math/big"
)

func factorial(v *big.Int, n int64)  *big.Int {
    var i int64
    var t *big.Int = big.NewInt(1)
    v = big.NewInt(1)
    for i = 1; i <= n; i++ {
        t = big.NewInt(i)
        v = v.Mul(v, t)
    }
    return v
}

func main() {
    var i int
    var n1 int = 9
    var n2 int = 30
    var v *big.Int
    // mpz_init (v);
    for i = n1; i <= n2; i++ {
        v = big.NewInt(1)
        v = factorial(v, int64(i))
        fmt.Printf("%d! = %s\n", i, v)
        if i == 20 {
            fmt.Printf("-- below calc are regular ----\n")
        }
    }
}

 


실행 결과:
프롬프트> go run recBigFact01.go
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
-- below calc are regular ----
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000



 

Posted by Scripter
,

 

// Filename: testComplex.go
//
// Execute: go run testComplex.go
//
// or
//
// Compile: go build  testComplex.go
// Execute: ./testComplex

package main

import (
    "fmt"
    "math/cmplx"
)

func main() {
    var z1 complex128 = 3.0 + 4.0i
    var z2 complex128 = 2.0 - 1.0i
    var z3 complex128 = z1 + z2
    var z4 complex128 = z1 - z2
    var z5 complex128 = z1 * z2
    var z6 complex128 = z1 / z2
    var z7 complex128 = cmplx.Conj(z1)
    var arg float64 = cmplx.Phase(z1)     // arument of a complex number
    var abs float64 = cmplx.Abs(z1)     // arument of a complex number

    fmt.Printf("z1 = %f + %fj\n", real(z1), imag(z1))
    fmt.Printf("z2 = %f + %fj\n", real(z2), imag(z2))
    fmt.Printf("So,\n")
    fmt.Printf("z3 = z1 + z2 = %f + %fj\n", real(z3), imag(z3))
    fmt.Printf("z4 = z1 - z2 = %f + %fj\n", real(z4), imag(z4))
    fmt.Printf("z5 = z1 * z2 = %f + %fj\n", real(z5), imag(z5))
    fmt.Printf("z6 = z1 / z2 = %f + %fj\n", real(z6), imag(z6))

    fmt.Printf("z7 = cmplx.Conj(z1) = %f + %fj\n", real(z7), imag(z7))
    fmt.Printf("arg = cmplx.Phase(z1) = %f\n", arg)
    fmt.Printf("abs = |z1| = cmplx.Abs(z1) = %f\n", abs)
}
 

/*
-------------------
Result of execution:
-------------------
z1 = 3.000000 + 4.000000j
z2 = 2.000000 + -1.000000j
So,
z3 = z1 + z2 = 5.000000 + 3.000000j
z4 = z1 - z2 = 1.000000 + 5.000000j
z5 = z1 * z2 = 10.000000 + 5.000000j
z6 = z1 / z2 = 0.400000 + 2.200000j
z7 = cmplx.Conj(z1) = 3.000000 + -4.000000j
arg = cmplx.Phase(z1) = 0.927295
abs = |z1| = cmplx.Abs(z1) = 5.000000
*/

 

Posted by Scripter
,

Go 언어의 int64 타입은 C 언어의 long long 타입에 해당한다. 즉 int64 타입은 64 비트(8 바이트)의 메모리공간을 차지하는 부호 있는 정수이다.


int64 타입의 한계로 인하여 20! 까지만 정확히 계산되었다.

* 소스 파일명: recursiveFactorial.go

package main

import (
    "fmt"
)

func recFacto(y int64, k, n int) int64 {
    if n <= 1 {
        return 1
    } else if k == n {
        return y
    }
    return recFacto(y*int64(k+1), k+1, n)
}

func factorial(n int) int64 {
    return recFacto(1, 1, n)
}

func main() {
    var n int = 25
    var i int
    for i = 0; i <= n; i++ {
        fmt.Printf("%d! = %d\n", i, factorial(i))
        if i == 20 {
            fmt.Printf("-- below calc are fault ----\n")
        }
    }
}



실행 결과:
프롬프트> go run recursiveFactorial.go
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
-- below calc are fault ----
21! = -4249290049419214848
22! = -1250660718674968576
23! = 8128291617894825984
24! = -7835185981329244160
25! = 7034535277573963776



 

Posted by Scripter
,


[파일명:  testSort.go]------------------------------------------------
package main

import (
    "fmt"
    "os"
    "sort"
)

func quickSort(array []string, start, end int) {
    var i int = start
    var k int = end
    var pivot string

    if end - start >= 1 {
        pivot = array[start]
        for k > i {
            for cmp(array[i], pivot) >= 0 && i <= end && k > i {
                i += 1
            }
            for cmp(array[k], pivot) < 0 && k >= start && k >= i {
                k -= 1
            }
            if k > i {
              swap(array,i, k)
            }
        }
        swap(array, start, k)

        quickSort(array, start, k - 1)
        quickSort(array, k + 1, end)
    } else {
        return
    }
}

func cmp(s string, t string) int {
     var slen int = len(s)
     var tlen int = len(t)
     if slen == 0 && tlen == 0 {
         return 0
     } else if slen == 0 {
         return 1
     } else if tlen == 0 {
         return -1
     }
     var minlen int = slen
     if tlen < slen {
         minlen = tlen
     }
     var i int
     for i = 0; i < minlen; i++ {
         if s[i] < t[i] {
             return 1
         } else if s[i] > t[i] {
             return -1
         }
     }
     if slen == tlen {
         return 0
     } else if slen < tlen {
         return 1
     } else if tlen > tlen {
         return -1
     }
     return 0
}

func swap(array []string, x int, y int) {
     var TBUF string = array[x]
     array[x]=  array[y]
     array[y] = TBUF
}

func printArray(array []string, start int,end int) {
    var i int
    fmt.Printf("[")
    for i = start; i < end; i++ {
        fmt.Printf("%s, ", array[i])
    }
    if end >= start {
        fmt.Printf("%s", array[end])
    }
    fmt.Printf("]\n")
}

func main() {
    var i int
    if len(os.Args) > 1 && len(os.Args) < 22 {
        var SBUF []string = make([]string, len(os.Args) - 1)
        for i = 0; i < len(os.Args) - 1; i++ {
            SBUF[i] = fmt.Sprintf(os.Args[i+1])
        }
        print("Original array: ")
        printArray(SBUF, 0, len(os.Args) - 2)

        quickSort(SBUF, 0, len(os.Args) - 2)
        print("Sorted array: ")
        printArray(SBUF, 0, len(os.Args) - 2)
    } else if len(os.Args) > 21 {
        fmt.Printf("Given too many items. (The counter of items should be less then 20.)\n")
    }
}
------------------------------------------------


프롬프트> chcp 65001
Active code page: 65001

프롬프트> go run testSort.go 하나 둘 셋 넷
Original array: [하나, 둘, 셋, 넷]
Sorted array: [넷, 둘, 셋, 하나]

프롬프트> go run testSort.go one two three four
Original array: [one, two, three, four]
Sorted array: [four, one, three, two]

프롬프트> chcp 949
활성 코드 페이지: 949

 

 


 

Posted by Scripter
,

초등학교 때 배우는 두 정수의 곱셈표를 만들어 주는 Go 소스이다.

/*
 * Filename: makeMultTable.go
 *
 *     Print a multiplication table.
 *
 *     Execute: go run makeMultTable.go 230 5100
 *
 *    or
 *
 *     Compile: go build makeMultTable.go
 *     Execute: ./makeMultTable 230 5100
 *
 * Date: 2012/06/28
 * Author: pkim (AT) scripts.pe.kr
 */
 
package main

import (
    "fmt"
    "os"
    "strconv"
)
   
func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func main() {
    var x, y int64
    if len(os.Args) >= 3 {
        x = atoi(os.Args[1])
        y = atoi(os.Args[2])
        print("\n")
        printMultTable(x, y)
    } else {
        printUsing()
   }
}

func atoi(s string) int64 {
    var n int
    n, _ = strconv.Atoi(s)
    return int64(n)
}

func printUsing() {
    print("Using: makeMultTable [number1] [number2]\n")
    print("Print a multiplication table for the given two integers.\n");
}

func printMultTable(x, y int64) {
    var nx, ny int64
    var z int64
    var ntail1 int
    var ntail2 int
    var y1 int
    var i int
    var strX string
    var strY string
    var strZ string
    var strT string
    var zeros string
    var whites string
    var bars string
    var line1 string
    var line2 string
    var line3 string
    var line4 string
    var loffset string
    var buf string

    nx = x
    if x < 0 { nx = -x }
    ny = y
    if y < 0 { ny = - y }
    ntail1 = 0
    ntail2 = 0
    for nx % 10 == 0 {
        nx = nx / 10
        ntail1 += 1
    }
    for ny % 10 == 0 {
        ny = ny / 10
        ntail2 += 1
    }
    z = nx * ny
    strZ = fmt.Sprintf("%d", z)
    strX = fmt.Sprintf("%d", nx)
    strY = fmt.Sprintf( "%d", ny)
    zeros = "0000000000000000000000000000000000000000"
    whites = "                                        "
    bars = "----------------------------------------"
    loffset =  "       "
    line4 = fmt.Sprintf("%s%d", loffset, nx*ny)
    buf = zeros[:ntail1 + ntail2]
    line4 += buf
    line1 = loffset
    buf = whites[:len(strZ) - len(strX)]
    buf += strX
    line1 += buf
    buf =  zeros[:ntail1]
    line1 += buf

    line2 = "   x ) "
    buf = whites[:len(strZ) - len(strY)]
    buf += strY
    line2 += buf
    buf = zeros[:ntail2]
    line2 += buf

    line3 = "     --"
    buf = bars[:len(strZ)]
    line3 += buf

    println(line1)
    println(line2)
    println(line3)
    if len(strY) > 1 {
        for i = 0; i < len(strY); i++ {
         buf = string(strY[len(strY) - i - 1])
            y1 = int(atoi(buf))
            if y1 != 0 {
                strT = fmt.Sprintf("%d", nx * int64(y1))
                line2 = loffset
                buf = whites[:len(strZ) - len(strT) - i]
                buf += strT
                line2 += buf
                println(line2)
            }
        }
        println(line3)
    }
    println(line4)
}



실행> go run makeMultTable.go 230 5100
또는

컴파일> go build makeMultTable.go
실행> ./makeMultTable 230 5100
결과>

          230
   x )   5100
     ------
         23
       115
     ------
       1173000

 


 

Posted by Scripter
,

다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Go 언어 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.


  1. /*
  2.  *  Filename: makeDivisionTable.go
  3.  *
  4.  *  Purpose:  Make a division table in a handy written form.
  5.  *
  6.  *  Execute: go run makeDivisionTable 12345 32
  7.  *  Execute: go run makeDivisionTable 500210 61
  8.  *
  9.  *  or
  10.  *
  11.  *  Compile:  go build makeDivisionTable.go
  12.  *  Execute: ./makeDivisionTable 12345 32
  13.  *  Execute:  ./makeDivisionTable 500210 61
  14.  *
  15.  *     Date:  2012/06/27
  16.  *   Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  17.  */
  18. package main
  19. import (
  20.     "fmt"
  21.     "os"
  22.     "strings"
  23.     "bytes"
  24.     "strconv"
  25. )
  26. func println(s string) {
  27.     fmt.Printf("%s\n", s)
  28. }
  29. func print(s string) {
  30.     fmt.Printf("%s", s)
  31. }
  32. func printUsage() {
  33.     println("Using: makeDivisionTable [numerator] [denominator]");
  34.     println("Make a division table in a handy written form.");
  35.     // println("사용법: makeDivisionTable [피제수] [제수]");
  36.     // println("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
  37. }
  38. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  39. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  40. func simplify(v float64,width int) string {
  41.     var n, leng int
  42.     var t string = "                               ";
  43.     var tmp string = "                               "
  44.     t = fmt.Sprintf("%g", v)
  45.     n = len(t)
  46.     if (n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0') {
  47.         t = t[:n-2]
  48.     }
  49.     leng = len(t)
  50.     tmp = t
  51.     if leng < width {
  52.         t = string(bytes.Repeat([]byte{' '}, width - leng))
  53.         t += tmp
  54.     }
  55.     return t
  56. }
  57. // 발음상 숫자에 맞는 주어 조사 "은", "는"을 결정한다.
  58. func getSuffix(v int64) string {
  59.     var buf string
  60.     var t int64 = v % 10
  61.     var suffix = "   "
  62.     var tbuf = "  "
  63.     var suf []string = []string { "은",  "는"}
  64.     suffix = suf[0]
  65.     tbuf = fmt.Sprintf("%d", t)
  66.     if strings.ContainsAny("2459", tbuf[0:1]) {
  67.         suffix = suf[1]
  68.     }
  69.     buf = suffix
  70.     return buf
  71. }
  72. func atoi(s string) int64 {
  73.     var n int
  74.     n, _ = strconv.Atoi(s)
  75.     return int64(n)
  76. }
  77. func makeTable(numer int64, denom int64, quotient int64) int64 {
  78.     var sbuf string
  79.     var strNumer string
  80.     var strDenom string
  81.     var strQuotient string
  82.     var strTmpR string;
  83.     var whiteChars string = "                                                                                 ";
  84.     var underbarChars string  = "_________________________________________________________________________________";
  85.     var barChars string  = "---------------------------------------------------------------------------------";
  86.     var offsetSpaces string
  87.     var biasSpaces string
  88.     var uline string;
  89.     var sline string
  90.     var i int
  91.     var lenN int
  92.     var lenD int
  93.     var lenQ int
  94.     var offsetLeft int
  95.     var bias int
  96.     var tmpR int64
  97.     var tmpSub int64
  98.     var oneDigit byte
  99.     strNumer = fmt.Sprintf("%d", numer)
  100.     strDenom = fmt.Sprintf("%d", denom)
  101.     strQuotient = fmt.Sprintf("%d", quotient)
  102.     lenN = len(strNumer)
  103.     lenD = len(strDenom)
  104.     lenQ = len(strQuotient)
  105.     offsetLeft = 3 + lenD + 3;
  106.     bias = lenN - lenQ
  107.     offsetSpaces = whiteChars[:offsetLeft]
  108.     biasSpaces = whiteChars[:bias]
  109.     uline = underbarChars[: lenN + 2]
  110.     sline = barChars[:lenN]
  111.     fmt.Printf("%s%s%d\n", offsetSpaces, biasSpaces, quotient)
  112.     sbuf = offsetSpaces[:offsetLeft - 2]
  113.     fmt.Printf("%s%s\n", sbuf, uline)
  114.     fmt.Printf("   %s ) %s", strDenom, strNumer)
  115.     strTmpR = strNumer[:bias + 1]
  116.     tmpR = atoi(strTmpR)
  117.     tmpSub = 0
  118.     for i = 0; i < lenQ; i++ {
  119.         if strQuotient[i] == '0' {
  120.             if i + 1 < lenQ {
  121.                 oneDigit = strNumer[bias + i + 1]
  122.                 fmt.Printf("%c", oneDigit)
  123.                 sbuf = fmt.Sprintf("%c", oneDigit)
  124.                 strTmpR += sbuf
  125.                 tmpR = atoi(strTmpR)
  126.             }
  127.         } else {
  128.             println("")
  129.             tmpSub = int64(strQuotient[i] - '0') * denom
  130.             fmt.Printf("%s%s\n", offsetSpaces, simplify(float64(tmpSub), bias + i + 1))
  131.             fmt.Printf("%s%s\n", offsetSpaces, sline)
  132.             tmpR = tmpR - tmpSub
  133.             if tmpR == 0 && i + 1 < lenQ {
  134.                 sbuf = whiteChars[:bias + i + 1]
  135.                 fmt.Printf("%s%s", offsetSpaces, sbuf)
  136.             } else {
  137.                 fmt.Printf("%s%s", offsetSpaces, simplify(float64(tmpR), bias + i + 1))
  138.             }
  139.             strTmpR = fmt.Sprintf("%d", tmpR)
  140.             if i + 1 < lenQ {
  141.                 oneDigit = strNumer[bias + i + 1]
  142.                 fmt.Printf("%c", oneDigit)
  143.                 sbuf = fmt.Sprintf("%c", oneDigit)
  144.                 strTmpR += sbuf
  145.                 tmpR = atoi(strTmpR)
  146.             }
  147.         }
  148.     }
  149.     println("")
  150.     return tmpR
  151. }
  152. // Go 언어의 실행 시작 지점
  153. func main() {
  154.     var a, b, q, r, k int64
  155.     var mbuf string
  156.     if len(os.Args) < 3 {
  157.         printUsage()
  158.         // os.Exit(1)
  159.         return
  160.     }
  161.     a = atoi(os.Args[1])
  162.     b = atoi(os.Args[2])
  163.     if a <= 0 {
  164.         /// fmt.Printf("피제수: %d\n", a)
  165.         /// println("피제수는 양의 정수라야 합니다.")
  166.         fmt.Printf("dividend: %d\n", a)
  167.         println("The dividend should be a positive integer.")
  168.         // os.Exit(1)
  169.         return
  170.     }
  171.     if b <= 0 {
  172.         /// fmt.Printf("제수: %d\n", b)
  173.         /// println("제수는 양의 정수라야 합니다.")
  174.         fmt.Printf("divider: %d\n", b)
  175.         println("The divider should be a positive integer.") 
  176.         // os.Exit(1)
  177.         return
  178.     }
  179.     q = a / b
  180.     r = a % b
  181.     /// fmt.Printf("나눗셈 %d ÷ %d 의 결과: ", a, b)
  182.     /// fmt.Printf("몫: %d, ", q)
  183.     /// fmt.Printf("나머지: %d\n", r)
  184.     fmt.Printf("The result of division %d / %d: ", a, b)
  185.     fmt.Printf("quotient: %d, ", q)
  186.     fmt.Printf("remainder: %d\n", r)
  187.     println("")
  188.     k = makeTable(a, b, q)
  189.     if k == r {
  190.         /// fmt.Printf("\n나머지: %d\n", k)
  191.         fmt.Printf("\nRemainder is %d\n", k)
  192.     }
  193.     if k == 0 {
  194.         fmt.Printf("%d = %d x %d\n", a, b, q)
  195.         mbuf = getSuffix(a)
  196.         mbuf = fmt.Sprintf("%s", mbuf)
  197.         /// fmt.Printf("%d%s %d의 배수(mupltiple)이다.\n", a, mbuf, b)
  198.         /// mbuf = getSuffix(b)
  199.         /// fmt.Printf("%d%s %d의 약수(divisor)이다.\n", b, mbuf, a)
  200.         fmt.Printf("%d is a multiple of %d.\n", a, b)
  201.         fmt.Printf("%d is a divisor of %d.\n", b, a)
  202.     } else {
  203.         mbuf = getSuffix(a)
  204.         fmt.Printf("%d = %d x %d + %d\n", a, b, q, r)
  205.         /// fmt.Printf("%d%s %d의 배수(mupltiple)가 아니다.\n", a, mbuf, b)
  206.         fmt.Printf("%d is not a multiple of %d.\n", a, b)
  207.     }
  208. }




실행> go run makeDivisionTable.go 500210 61

또는

컴파일> go build makeDivisionTable.go

실행> ./makeDivisionTable.go 500210 61

The result of division 500210 / 61: quotient: 8200, remainder: 10 8200 ________ 61 ) 500210 488 ------ 122 122 ------ 10 Remainder is 10 500210 = 61 x 8200 + 10 500210 is not a multiple of 61.
Posted by Scripter
,