2016-10-19 6 views
3

다음 작업을 수행하기 위해 C로 프로그램을 작성하려고합니다.C에서 float 범위를 반복 함

입력 : 세 개의 배정 밀도 a, b 및 c.

출력 : b에서 a까지의 모든 숫자는 c의 감소에 도달 할 수 있습니다.

다음은 간단한 프로그램입니다 (파일명 : range.c).

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    double high, low, step, var; 
    printf("Enter the <lower limit> <upperlimit> <step>\n>>"); 
    scanf("%lf %lf %lf", &low, &high, &step); 
    printf("Number in the requested range\n"); 
    for (var = high; var >= low; var -= step) 
     printf("%g\n", var); 
    return 0; 
} 

그러나 for 루프 오히려 이상하게 어떤 입력에 대한 동작. 예를 들면 다음과 같습니다.

10-236-49-81:stackoverflow pavithran$ ./range.o 
Enter the <lower limit> <upperlimit> <step> 
>>0.1 0.9 0.2 
Number in the requested range 
0.9 
0.7 
0.5 
0.3 
10-236-49-81:stackoverflow pavithran$ 

왜 루프가 var = 0.1에서 종료되는지 알 수 없습니다. 다른 입력에 대해서는 예상대로 작동합니다.

10-236-49-81:stackoverflow pavithran$ ./range.o 
Enter the <lower limit> <upperlimit> <step> 
>>0.1 0.5 0.1 
Number in the requested range 
0.5 
0.4 
0.3 
0.2 
0.1 
10-236-49-81:stackoverflow pavithran$ 

첫 번째 상황에서 이상한 동작이 숫자 정밀도와 관련이 있습니까?

범위에 항상 바닥 ((높음 - 낮음)/단계) +1 숫자가 포함되도록하려면 어떻게해야합니까?

나는 루프 변수를 정수로 스케일하고, 스케일링으로 나눈 루프 변수의 결과를 출력하는 플로트 오버 루핑 방법을 시도했다. 그러나 아마도 더 나은 방법이있을 것입니다 ...

+2

가능한 복제 [소수점 연산이 깨진 떠?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – LPs

+0

나는 문제가 설명이 필요하다고 생각. 감소가 이중 산술 또는 실수 산술로되어 있습니까? –

답변

5

for 루프의 카운터로 double을 사용하면 매우 신중해야합니다. 많은 경우에 피하는 것이 가장 좋습니다.

정확히 10 진수의 모든 숫자가 2 진 부동 소수점에도 정확하게 일치하는 것은 아닙니다. 사실, IEEE754 부동 소수점의 경우, 2 진 합병 만이 있습니다. 0.5는 그렇지만 0.4, 0.3, 0.2 및 0.1은 그렇지 않습니다.

가장 가까운 IEEE754 부동 소수점 double은 실제로는 다소 큰 0.200000000000000011102230246251565404236316680908203125입니다. 귀하의 경우에는

0.9에서 이것의 반복 뺄셈은 결국 그의 첫번째 중요한 인물이다 a 첫번째 중요한 인물이다 a - 3 숫자가 될 수를 발생합니다 버그는 다음 자체 명단.

간단한 해결 방법은 정수로 작업하고 매회 1 회씩 수행하고 step을 사용하여 출력을 조정하는 것입니다. 의