2011-09-29 4 views

답변

0

응용 프로그램을 저장하는 경우 C/C++의 부동의 또는 이중의 같은에서 부동 소수점 값이, 당신이있을 수 있습니다 여기 문제.

우선 float/double은 기본 -2를 사용하는 값을 나타내며 double x = 0.1;과 같은 값을 입력하면 x는 실제로 0.1과 같지 않지만 0.1에 매우 가깝습니다. 왜냐하면 모든 소수 (10 진수)는 기본 -2로 정확하게 표현할 수 없기 때문입니다.

printf와 유사한 함수 중 하나를 사용하여 x를 인쇄하거나 문자열로 변환 할 때 결과 문자열은 0.099999999에서 0.1 to 0.10000000000000000555와 다를 수 있습니다. 결과는 x에있는 내용과 문자열로 변환하는 방법에 달려 있습니다 (정수 부분, 소수 부분 또는 모두를 허용하는 숫자).

일반적으로 여기에는 하나의 해결책이 없습니다. 하나의 경우 정확성과 반올림 문제는 중요하지 않을 수 있지만 다른 경우에는 가장 중요 할 수 있습니다. 소수 단위의 정확한 표현보다 성능이 중요한 경우, 기본 2 유형을 사용합니다. 그렇지 않으면 예를 들어, 돈을 계산할 때 소수점 이하를 정확하게 나타낼 수있는 특수 유형을 사용하면 (그리고 먼저 구성해야 할 수도 있음) 추가 계산 시간을 소비하면서 설명 된 문제 중 일부를 피할 수 있습니다. 저장.

고정 소수점 유형 및 산술을 사용하는 경우가 있습니다. 당신의 숫자가 3 개 이상의 소수 자릿수가없는 너무 큰되지 않습니다하는 경우는 예를 들어, 스케일 정수를 사용할 수 있습니다

long x = 123456; // x represents 123.456 

을 당신은 빼고 그냥 평범한 정수로 비교, 추가,하지만 당신은 곱

long x = 123456; // x represents 123.456 
long y = 12345; // y represents 12.345 
long p = (long)(((long long)x * y)/1000); // p=1524064, representing x*y=1524.064 
long q = (long)((long long)x * 1000)/y); // q=10000, representing x/y=10.000 

을이 경우에는 단지 (엑스 ~ 1000)/100 (X % 100)를 보면, 소수 부분의 자리수를 알아낼 비교적 간단하다 같이, 예를 들면, 다르게 나누어/10 및 x % 10이다.

0

13.0000과 같이 13.0000과 같은 2 개의 값으로 13.00000 또는 13.20001을 나눈 값이 같으면 값이 0보다 큰지 여부 (예 : 13.20001 여기서 2001> 0)를 비교합니다. else (예 : 13.0000, 여기서 0000 = 0) % .2f => 13.00

관련 문제