윈도우 xp pro - 32bit :: 윈도우용 gcc 4.4.0 버전에서 long double 언더 플로우 문제...

kophoenix3의 이미지

제가 윈도우용 gcc 4.4.0 버전을 밍드블유 홈페이지에서 삽질하여 설치하였습니다.
설치에는 문제 없는듯 합니다만 long doulbe 자료형으로 계산할 때에 문제가 발생합니다.

아래는 제급근 구하는 프로그램입니다.

-------------------------------------------------------------------

#include <stdio.h>

int main(void)
{
long double ldNumber = 0.0L;
long double ldLow = 0.0L;
long double ldHigh = 0.0L;

long double ldTemp = 0.0L;
long double ldSwitch = 0.0L;

int count = 0;

printf("input long double number 1 ~ 10000 (i.e: 10.0): ");
scanf("%Lf", &ldNumber);

ldSwitch = 1.0L; // <<-- ldSwitch에 1.0을 대입하고자 하지만 대입이 안됩니다. (0.0 이 출력됨)
ldLow = 0.0L;
ldHigh = 10000.0L;
count = 0;

while(count < 5)
{
ldSwitch *= 0.1L;
// printf("%Lf\n", ldSwitch); <<-- 언더플로우가 발생합니다.

while(ldLow * ldLow <= ldNumber)
{
ldLow += ldSwitch;
}

ldLow -= ldSwitch;

printf("%Lf\n", ldLow);

while(ldHigh * ldHigh >= ldNumber)
{
ldHigh -= ldSwitch;
}

ldHigh += ldSwitch;

printf("%Lf\n", ldHigh);

count++;
}

printf("\n\n");

if(ldLow >= ldHigh)
{
ldTemp = ldLow;
ldLow = ldHigh;
ldHigh = ldTemp;
}

printf("%.12Lf sqrt is %.16Lf ~ %.16Lf\n", ldNumber, ldLow, ldHigh);

return(0);
}

-------------------------------------------------------------------

이유를 모르겠습니다.

컴파일은 아래와 같이 해 보았습니다.
gcc -W -Wall sqrt.c

이렇게 하면
warning: unknown conversion type character 'L' in format
warning: too many arguments for format

이렇게 경고가 뜹니다.

깨끗하게 컴파일 완성하는 방법 없을까요?

winner의 이미지

저도 MinGW bug인 줄 알았습니다. 검색해보면 나옵니다만...
알고 봤더니 MinGW가 msvcrt를 사용하는데 이 녀석은 long double을 double과 동일하게 취급합니다.
64bit compile은 어떻게 나오는지 모르겠습니다만 Visual C++의 경우 32bit는 항상 double과 동일하게
long double을 취급하죠. 이유는 모르겠습니다만 아마도 과거의 호환성 문제 때문일 듯...
사실 표준은 long double을 double 이상이면 된다고 했지, 그 이상 커야된다는 규정은 없거든요.
하여간 GCC에서 MinGW가 나왔기 때문에 현재 GCC는 long double을 double보다 큰 자료형이고,
연산도중에는 문제가 없지만 msvcrt가 사용되는 printf에서는 long double을 double 보다 큰 자료형으로
처리하지 못합니다.
따라서 long double을 써서 연산과정의 손실을 줄일 수는 있지만 printf를 써서 출력하려면
double로 변환할 수 밖에 없습니다. 그게 아니라면 손수 printf %Lf를 작성할 수 밖에요... -_-.

kophoenix3의 이미지

답변 고마워요...~~!

하루 동안 고민했는데,

해결되었습니다.

즐거운 하루 되세요~~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.