2017-09-22 7 views
0

정확하게 Go에 2 개의 float을 빼는 방법에 관심이 있습니다.Go 산술에서 부동 소수점 정밀도 다루기?

math/big 라이브러리를 사용하려고했지만 정확한 결과를 얻을 수 없습니다.

나는이 문제를 해결하는 자바 스크립트에서 big.js 라이브러리를 사용했습니다. Go 연산과 비슷한 라이브러리/메소드가 있습니까? x.Text ('g', 10와 같은

package main 

    import (
     "fmt" 
     "math/big" 
    ) 

    func main() { 
     const prec = 200 
     a := new(big.Float).SetPrec(prec).SetFloat64(5000.0) 
     b := new(big.Float).SetPrec(prec).SetFloat64(4000.30) 
     result := new(big.Float).Sub(a, b) 
     fmt.Println(result) 
    } 
    Result: 999.6999999999998181010596454143524169921875 

https://play.golang.org/p/vomAr87Xln

+2

귀하의 의견은 귀하의 의견만큼 정확합니다. 귀하의 의견은 float64입니다. 정확성을 높이려면 float64로 시작하지 마십시오. – user2357112

+2

@ user2357112 : 정확도는 이진 부동 포인트 (10 진수의 경우 근사치) 인 내부 표현의 함수이기도합니다. – peterSO

답변

2

Package big

수입 "수학/큰"

func (*Float) String

func (x *Float) String() string 

문자열 형식 X). (문자열은 Float.Format이 %의 동사를 지원하지 않습니다, 명시 적으로 를 호출해야합니다.)

를 사용하여 문자열 입력과 출력의 둘레에, 예를 들어,

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    const prec = 200 
    a, _ := new(big.Float).SetPrec(prec).SetString("5000") 
    b, _ := new(big.Float).SetPrec(prec).SetString("4000.30") 
    result := new(big.Float).Sub(a, b) 
    fmt.Println(result) 
    fmt.Println(result.String()) 
} 

출력 :

999.6999999999999999999999999999999999999999999999999999999995 
999.7 

10 진수의 경우 이진 부동 소수점 숫자는 근사값입니다. 예를 들어, 십진수 0.1은 정확하게 나타낼 수 없으며 약 1.10011001100110011001101 * (2**(-4))입니다.

당신은 이미 십진수 반복에 대해 알고 있기 때문에 당신은 이미 유익한 숫자에 대한 근사치 인 1/3 = .333...3227/555 = 5.8144144144...을 알고 있기 때문에 익숙합니다.

What Every Computer Scientist Should Know About Floating-Point Arithmetic을 참조하십시오.

1

아마도 github.com/shopspring/decimal을 시도해보십시오.

"이동 중에 임의 정밀도 고정 소수점 10 진수"패키지를 자체적으로 호출합니다.

참고 : "단지"는 소수점 이하 2^31 자리 숫자를 나타낼 수 있습니다.

+0

위대한 링크를 가져 주셔서 감사합니다! – patrickandroid