2016-09-03 9 views
-3

욕심 많은 프로그램에 대한 내 코드는 4.2를 제외하고 지금까지 모든 숫자에서 잘 작동합니다. 사람이 오류cs50 pset1 욕심이 드는 비정상적인 버그

:) greedy.c exists 
:) greedy.c compiles 
:) input of 0.41 yields output of 4 
:) input of 0.01 yields output of 1 
:) input of 0.15 yields output of 2 
:) input of 1.6 yields output of 7 
:) input of 23 yields output of 92 
**:(input of 4.2 yields output of 18 
    \ expected output, but not "22\n"** 
:) rejects a negative input like -.1 
:) rejects a non-numeric input of "foo" 
:) rejects a non-numeric input of "" 

#include <stdio.h> 
#include <cs50.h> 

int main(void) 
{ 
    float x; 
    do 
{ 
    printf("how much change is owed(in dollars)?:\n"); 
    x = GetFloat(); 
} 
    while (x < 0); 


    x = x*100; 
    int i = 0; 
while (x >= 25) 
{ 
    x = (x-25); 
    i++; 
} 


    while (x >= 10) 
{ 
    x = (x-10); 
    i++; 
} 

while (x >= 5) 
{ 
    x = (x-5); 
    i++; 
} 

while (x >= 1) 
{ 
    x = (x-1); 
    i++; 
} 
printf("%d\n",i); 
} 
+4

[부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken)를 참조하십시오. int 값으로 작업하는 것이 더 좋습니다. 이 문제를 나타내는 SO에 대한 많은 "변경"질문이 있습니다. 지금까지 "비정상적인"것이 아닌 단계는 당신이 통과하는 단계입니다. –

+0

정확한 값이 필요하면 부동 소수점을 사용하지 마십시오. – Olaf

답변

0

변경

x = floor(x*100); printf("rounded value: %f\n", x);

,536,913,632에 다음 줄

x = x*100;

을 지적 할 수있는 경우 그것을 감사 정말시겠습니까 10

rounded value: 419이 출력되고 22는 올바른 대답입니다. 에 저장되는 값은 420에 가깝지만 조금 작기 때문에 지금 상황이 발생합니다.

0

이 버그는 다음 코드를 실행, 부동 소수점 부정확성과 관련이있다 그리고 당신이 정말로 후드 아래에 무슨 일이 일어나고 있는지 참조 : 그래서 그 대신 처음에 해당하는 양의 정수로 값을 변환하는 것이 좋습니다

float x = 4.2; 
printf("%.50f\n", x); 

($ 4.2는 420 센트와 같음을 기억하십시오.)이 값으로 계산하십시오 (그리고 값을 반올림하는 것을 잊지 마십시오).

0

항상 부동 소수점 숫자에는 부정확성이 있습니다. 따라서 floatint으로 변환하는 것이 좋습니다. 당신은 int amount = lroundf(change*100);에 의해 그렇게 할 수 있습니다 또한 값이 100 배로 증가합니다. 이것은 센트를 제거하고 'lroundf'명령을 사용하여 원치 않는 값을 반올림하는 것입니다.