golangkorea / golang-spec

Go 언어 스펙 한글 번역
https://www.gitbook.com/book/gosudaweb/go-language-specification-in-korean/details
Other
85 stars 22 forks source link

infinite precision #314

Open dakeshi opened 6 years ago

dakeshi commented 6 years ago

infinite precision(무한 정밀도) 에 대한 논의는 constant expression 챕터 리뷰과정에서 시작되었고, conversion 챕터 리뷰과정에서 implicit infinite precision 관련해서 추가 토의가 진행중입니다.

constant expression 챕터에서 infinite precision이 언급된 문장은 다음과 같습니다.

This rounding may cause a floating-point constant expression to be invalid in an integer context, even if it would be integral when calculated using infinite precision, and vice versa.

번역문: 무한 정밀도(infinite precision)로 계산해서 정수가 나오는 경우에도 이런 현상이 발생할 수 있으며, 그 반대의 경우도 마찬가지다.

아래는 constant expression 챕터 리뷰 과정에서 나온 infinite precision 관련 토의내용입니다.

conversion 챕터에서 infinite precision이 언급된 문장은 다음과 같습니다.

When converting between integer types, if the value is a signed integer, it is sign extended to implicit infinite precision; otherwise it is zero extended.

참고 문서

infinite precision는 arbitary precision이라고도 불립니다. infinite precision 에 대한 wikipedia 정의는 다음과 같습니다.

In computer science, arbitrary-precision arithmetic, also called bignum arithmetic, multiple-precision arithmetic, or sometimes infinite-precision arithmetic, indicates that calculations are performed on numbers whose digits of precision are limited only by the available memory of the host system.

주로 매우 큰 수(big number)를 다뤄야 할 때 자주 언급되는 개념이지만, 꼭 큰 수에만 국한된 문제는 아닙니다.

Go 2 proposal 에서 overhead 를 피하기 위한 방법으로 change int to be arbitrary precision 이 제안되었습니다. 관련 이슈는 https://github.com/golang/go/issues/19623 에서 확인할 수 있습니다.

아래는 infinite precision 및 conversion과 관련해서 추가로 참고할 만한 글들입니다.

-Go lang FAQ, Why does Go not provide implicit numeric conversions? -Go blog, constants

부연 설명

추가적인 의견과 설명은 코멘트에 남겨주시길 바랍니다.

jhonghee commented 6 years ago

Conversions 섹션에 언급된 implicit infinite precision은 낮은 정밀도의 정수에서 높은 정밀도의 정수로 변환하는 규칙이 무한한 정밀도를 가정하더라도 같이 적용된다는 얘기를 하는 것 같네요: e.g. int8 -> uint64

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

dakeshi commented 6 years ago

롭 파이크의 제안을 읽어보니 infinite precision(=arbitary precision)은 하드웨어 레지스터 처리 용량에 상관없이 프로그래밍 레벨 단계(상위 레벨)에서 구현하는 것으로 보이는데 제가 이해한게 맞나요? 위키에서도 약간 혼동되게 설명해놨네요. 처음에는 호스트 하드웨어에 따라 달라지는 것 처럼 설명하고 프로그래밍 언어에서는 빌트인 라이브러리 형태로 precision을 조정할 수 있는 것으로 표현하고 있군요. 분야별로 다른 의미를 갖는 건가요?

@jhonghee 님 답변입니다. infinite precision은 언어를 막론하고 소프트웨어적으로 처리하는게 상식적인 이해 같습니다.

ezaurum commented 6 years ago

지금까지를 봐서는 문맥상 약간 다른 의미를 가지고 있는 것 같습니다. Constant에서 사용된 경우는 float->integer의 경우에 infinite precision을 안 쓴다는 말과도 같으니 어떤 경우라고 해도 말이 되구요. Conversion의 경우도 @jhonghee 말씀대로 https://github.com/golangkorea/golang-spec/issues/314#issuecomment-361820895 낮은 정밀도의 정수에서 높은 정밀도로 변환시 발생하는 부호 문제에 대해서만 논의하는 부분이라고 보이구요.