인프런 커뮤니티 질문&답변

masiljangajji님의 프로필 이미지
masiljangajji

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

6-G

6-G 자료형 질문

작성

·

264

0

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<numeric>
#include<map>
#include<cstring>
using namespace std;

typedef long long ll;

long double X, Y;
int Z;

bool check(ll mid) {

	 double total = X;
	 double win = Y;

	total += mid;
	win += mid;

	int num = (win / total) * 100;

	return Z < num;
}

int main()
{


	cin >> X >> Y;

	Z = (Y / X) * 100;


	int start = 1;
	int end = 1000000000;

	int ans = -1;


	while (start <= end) {

		ll mid = start + end;
		mid /= 2;

		if (check(mid)) {
			ans = mid;
			end = mid - 1;
		}
		else
			start = mid + 1;

	}

	cout << ans;

	return 0;

}

 

다음과 같이 작성했습니다.

Z = (Y / X) * 100;

이 부분에서 X,Y가 double이면 오답

long double이면 정답이 나옵니다 .

double로 선언하면 어떤 문제점이 존재하나요??

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 0508님 ㅎㅎ

아마 정밀도 때문에 그런거 같습니다.

컴파일러마다 다르지만 long double은 8, 12, 16바이트를 커버하는 double타입이며

double과 long double은 다음과 같은 범위를 커버합니다.

double : ±2.23 x 10^-308 to ±1.80 x 10^308

long double : ±3.36 x 10^-4932 to ±1.18 x 10^4932

 

다만, 그래서 소수점 연산을 할 때는 곱셈부터 하는게 좋은데요. (왜냐면 소수점이 줄어들기 때문이죠)

0508님 코드이며 double로도 통과하는 코드입니다. 참고부탁드립니다.

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<numeric>
#include<map>
#include<cstring>
using namespace std;

typedef long long ll;

double X, Y;
int Z;

bool check(ll mid) {

	 double total = X;
	 double win = Y;

	total += mid;
	win += mid;

	int num = (win / total) * 100;

	return Z < num;
}

int main()
{


	cin >> X >> Y;

	Z = (Y  * 100/ X);


	int start = 1;
	int end = 1000000000;

	int ans = -1;


	while (start <= end) {

		ll mid = start + end;
		mid /= 2;

		if (check(mid)) {
			ans = mid;
			end = mid - 1;
		}
		else
			start = mid + 1;

	}

	cout << ans;

	return 0;

}

 

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

안녕하세요, 인프런 AI 인턴이에요.

double과 long double 모두 부동소수점을 표현할 때 사용하는 자료형입니다. 그러나 double은 64bit로 이루어져 있지만, long double은 80bit 또는 128bit로 이루어져 있습니다. 그래서 double은 long double에 비해 정밀도가 낮다는 단점이 있습니다. 때문에 double은 소수점 이하 15자리 정도의 정밀도 밖에 없는 반면 long double은 19자리 정도의 정밀도를 가집니다.

따라서, 소수점 이하 자리수가 중요한 경우 long double을 사용하는 것이 안전합니다. 이 문제에서도 X,Y를 long double로 선언하면 보다 정밀한 연산을 할 수 있습니다.

그리고 코드의 check 함수에서도 double을 사용하면 정밀도 손실이 발생할 수 있습니다. 따라서 long double을 사용하는 것이 좋습니다.

masiljangajji님의 프로필 이미지
masiljangajji

작성한 질문수

질문하기