opteron, gcc 3.4.3 환경에서 double형 변수의 유효숫자
글쓴이: take_it_easy / 작성시간: 화, 2005/03/22 - 3:22오전
gcc 3.4 버전부터 64bit compile을 지원한다는 소식을 듣고
opteron dual 시스템에
gentoo를 설치하고
시험삼아서 double형 변수의 유효숫자 15자리를 넘는 연산을 해보았더니..
32bit system에서와 마찬가지로 유효숫자 15자리를 넘지않더군요.
64bit compile이 된다는 이야기가 당연히 유효숫자의 폭도 커지리라고 막연하게 생각하고 있었는데.. -,.-
alpha system에 ccc ( compaq c compiler )로 컴파일하면
double 형 변수의 유효숫자는 15자리보다 더 커진다고 알고 있었는데..
opteron에서 gcc를 사용하면 double 형 변수의 유효숫자는 32bit 환경에서와 변함없이 15자리인지 궁금합니다.
제온용 intel c compiler를 opteron에서도 사용가능하다는 이야기를 들었는데
intel c compiler에서는 double형의 유효숫자 자리수가 어떻게 되는지 궁금합니다.
Forums:
관련 상수는 <float.h>에 정의되어 있습니다.fl
관련 상수는 <float.h>에 정의되어 있습니다.
float type의 유효 숫자 = FLT_DIG
double type의 유효 숫자 = DBL_DIG
long double type의 유효 숫자 = LDBL_DIG
제 32-bit machine에서는 다음과 같습니다:
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
답변 감사드립니다.
작성하신 코드로 시험을 해보니
제 환경( opteron, gcc 3.4.3 ) 에서도 동일하게
float, double, long double의 유효숫자가
6, 15, 18로 나오네요.
컴파일 옵션은 gcc -march=k8 -m64 등을 주어서 해보았습니다.
그런데 염치없게도 궁금한 점이 하나 더 생겨서 질문드립니다. --
gcc의 경우 long double형의 변수는 원래 지원되지 않는
type아닌가요?
long double로 변수를 선언하고
1. + 0.5 와 같은 간단한 연산을 해보아도 이상한 결과를 보이던데..
64-bit machine은 경험이 없어서 뭐라 말씀드리기 힘드네요.
64-bit machine은 경험이 없어서 뭐라 말씀드리기 힘드네요.
long double은 ISO C 표준에서 정의하고 있는 표준 타입입니다. GCC가 지원하지 않을 이유가 없죠. 그리고 이상한 결과가 나왔다면, 출력을 올바로 했는지 (예를 들어 printf()에서 올바른 format specifier를 썼는지), 아니면 상수를 쓸 때 long double type으로 했는지 등을 확인해 보기 바랍니다:
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
어떤 data model을 사용하느냐에 따라서 double의 크기가 결정
어떤 data model을 사용하느냐에 따라서 double의 크기가 결정됩니다. 예를 들면 Sun machine에서 64bit으로 컴파일하여도 64bit에서는 LP64 data model을 사용하기 때문에 double 크기는 8 바이트, int는 4 바이트f로 32bit과 동일합니다. Linux 쪽은 자료를 찾지 못했는데, 64bit에서는 LP64 data model을 사용할 것으로 추측됩니다.
64bit data model에 대한 설명
http://www.opengroup.org/public/tech/aspen/lp64_wp.htm
HP에서의 32bit과 64bit의 data 크기 비교
http://docs.hp.com/en/5966-9887/ch03s01.html
...
답변주신 cinsk, fatman님 모두 감사드립니다. 무식쟁이
답변주신 cinsk, fatman님 모두 감사드립니다.
무식쟁이 이참에 열심히 공부하게 되었네요. ^^
그리고 long double의 경우 출력문제가 맞습니다. --
%lf 로 열심히 출력하고 있었네요.
다시한번 감사드립니다.
지나가다 감사드립니다. ^^
long double을 %lf로 출력할때마다 값이 이상하게 나와서 이게 뭔가 싶었는데
%Lf로 출력하는 것이었네요.. 이런걸 모르고 있었다니....
행복한 하루 되세요 ~ ^^
타인을 자기 자신처럼 존경할수 있고, 자기가 하고 싶다고 생각하는 것을 타인에게 할 수 있다면, 그 사람은 참된 사랑을 알고 있는 사람이다. 그리고 세상에는 그 이상 가는 사람은 없다.
SGI 머신에서는 조금 다르군요.
SGI 머신에서는 결과가 조금 다르네요.
FLT_DIG : 6
DBL_DIG : 15
LDBL_DIG : 31
MIPS R16000, 64비트 RISC 계열 CPU를 장착하고 있는 녀석입니다.
+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+
+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+
댓글 달기