opteron, gcc 3.4.3 환경에서 double형 변수의 유효숫자

take_it_easy의 이미지

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형의 유효숫자 자리수가 어떻게 되는지 궁금합니다.

cinsk의 이미지

관련 상수는 <float.h>에 정의되어 있습니다.

float type의 유효 숫자 = FLT_DIG
double type의 유효 숫자 = DBL_DIG
long double type의 유효 숫자 = LDBL_DIG

제 32-bit machine에서는 다음과 같습니다:

$ cat tmp.c
#include <stdio.h>
#include <float.h>

int
main(void)
{
  printf("%d\n", FLT_DIG);
  printf("%d\n", DBL_DIG);
  printf("%d\n", LDBL_DIG);
  return 0;
}

$ cc tmp.c
$ a.out
6
15
18
$ _
take_it_easy의 이미지

작성하신 코드로 시험을 해보니
제 환경( 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 와 같은 간단한 연산을 해보아도 이상한 결과를 보이던데..

cinsk의 이미지

64-bit machine은 경험이 없어서 뭐라 말씀드리기 힘드네요.

long double은 ISO C 표준에서 정의하고 있는 표준 타입입니다. GCC가 지원하지 않을 이유가 없죠. 그리고 이상한 결과가 나왔다면, 출력을 올바로 했는지 (예를 들어 printf()에서 올바른 format specifier를 썼는지), 아니면 상수를 쓸 때 long double type으로 했는지 등을 확인해 보기 바랍니다:

$ cat tmp.c
#include <stdio.h>

int
main(void)
{
  printf("%Lf\n", 1.0L + 0.5);
  return 0;
}

$ cc tmp.c
$ a.out
1.500000
$ _
fatman의 이미지

어떤 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

...

take_it_easy의 이미지

답변주신 cinsk, fatman님 모두 감사드립니다.

무식쟁이 이참에 열심히 공부하게 되었네요. ^^

그리고 long double의 경우 출력문제가 맞습니다. --
%lf 로 열심히 출력하고 있었네요.

다시한번 감사드립니다.

gauri123의 이미지

long double을 %lf로 출력할때마다 값이 이상하게 나와서 이게 뭔가 싶었는데
%Lf로 출력하는 것이었네요.. 이런걸 모르고 있었다니....
행복한 하루 되세요 ~ ^^

타인을 자기 자신처럼 존경할수 있고, 자기가 하고 싶다고 생각하는 것을 타인에게 할 수 있다면, 그 사람은 참된 사랑을 알고 있는 사람이다. 그리고 세상에는 그 이상 가는 사람은 없다.

BeEye의 이미지

SGI 머신에서는 결과가 조금 다르네요.

FLT_DIG : 6
DBL_DIG : 15
LDBL_DIG : 31

MIPS R16000, 64비트 RISC 계열 CPU를 장착하고 있는 녀석입니다.
+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+

+------------------------------------+
|항상 행복하고 싶은 평범한 지구인.|
+------------------------------------+

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.