2014-03-29 3 views
-1

C/C++에 부동 소수점 숫자 관리 문제가 있다고 들었습니다. 간단한 프로그램을 구현했습니다. 그것은 변경 기계로 구성됩니다 : 사용자가 청구 금액 및 지불 수량을 입력하고 프로그램은 각 동전 유형에 대한 동전의 수를 계산하여 계산합니다. Link to my google drive folder with the codeC++에서 float 또는 double 숫자를 사용하여 작업합니다. 표현의 오류. 십진수 값의 손실

건이며,이 아닌 정수 값을 삽입 할 때, 프로그램이 루프에 입력하고 끝나지 않아 : 여기

는 코드입니다. 나는 무엇이 진행되고 있는지를 알기 위해 변수의 내용을 인쇄했으며, 어떻게 든 2 진수 값에서 0.10이라고 가정하자. 프로그램은 그 값을 0.0999998로 변경한다. 그런 다음 처리 할 나머지 변경 사항은 0이 아니며 무한 루프로 입력됩니다.

나는 이것이 플로트 포인트 번호의 기계 표현 때문이라고 들었습니다. 나는 동일한 창과 리눅스를 실험했다. 또한 자바로 프로그래밍하지만 파스칼에서도 같은 문제가 있었던 것을 기억하지 못합니다.

음, 이제 질문이 있습니다.이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 나는 가능한 해결책 중 하나가 외부 라이브러리를 통해 고정 소수점 표현을 사용하고 있다고 생각했습니다 : http://www.trenki.net/content/view/17/1/ 또는 http://www.codef00.com/code/Fixed.h. 다른 사람은 다음과 같이 정밀도 산술 라이브러리를 사용하는 것입니다. GMP

+2

코드는 여기에 게시되어야합니다. 그렇지 않으면 질문에 영구적 인 가치가 없으며 삭제에 대한 책임이 있습니다. – EJP

+4

달러의 부동 소수점 숫자로 작업하지 마십시오. 단순한 정수 센티미터로 작업하십시오. – enhzflep

+0

Akronix, 다음에 링크를 게시하지 마십시오. 코드가 너무 많으면 테스트 할 수있는 예제를 만듭니다. – yizzlez

답변

3

C 또는 C++에는 부동 소수점 값에 문제가 없습니다. 프로그래머는 부동 소수점을 지원하는 모든 언어에서 적절하게 부동 소수점을 사용할 수 있다고 믿습니다.

정수 변수는 분수 나 경계 값을 저장할 수 없지만 부동 소수점에는 분수의 특정 하위 집합 만 저장할 수 있습니다. 고품질의 부동 소수점 구현은 또한 계산의 정확성을 확실하게 보장합니다.

부동 소수점 숫자는 합리적인 숫자가 아니므로 안정적으로 저장하려면 무한한 공간이 필요합니다.

+1

더 구체적으로 말하면, 컴퓨터에 0.1을 플로트에 저장하도록 요청할 것입니다. IEEE Float 및 double은 2 진 부동 소수점 형식입니다. 그들은 97, 0.25 및 7.3125를 완벽한 정확도로 저장할 수 있지만 0.1을 저장할 수는 없습니다.이것은 기본 -10 숫자가 1/3을 저장할 수없는 것과 같은 이유 때문입니다. 일부 언어는 이것을 당신에게 숨기지 만 어떤 언어도 당신에게서 완벽하게 숨길 수는 없습니다. 문제는 C/C++에서 발생하지 않습니다. –