윈도우 xp pro - 32bit :: 윈도우용 gcc 4.4.0 버전에서 long double 언더 플로우 문제...
제가 윈도우용 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이렇게 경고가 뜹니다.
깨끗하게 컴파일 완성하는 방법 없을까요?
아마도 유명한 문제일 듯...
저도 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를 작성할 수 밖에요... -_-.
답변 감사합니다.
답변 고마워요...~~!
하루 동안 고민했는데,
해결되었습니다.
즐거운 하루 되세요~~
댓글 달기