2012-09-13 2 views
-1

다음 행 코드 본 (임베디드 프로그래밍, C 언어, 코드 컴포저 스튜디오 컴파일러)이다반환 값이 예상대로 아닙니다. MIN, 컴파일러 문제, 숫자 오버플로가 발생합니까?

#define MIN(a,b) (((a) < (b)) ? (a) : (b)) 

21.0F 로컬 변수의 결과이다

bs[Line] = (21.0F - ((13.5F/0.035F) * (MIN(abs_yaw, 0.06F) - 0.025F))); 

,

위의 줄에있는 다른 값은 실제로 상수입니다.

abs_yaw가 0.025를 약간 넘는 경우 (우리가 알고있는 것처럼) 우리는 abs에 가까운 bs를 얻어야합니다. 그러나 우리는 -341.9와 같은 bs를받습니다 ...

이것이 일어날 수있는 이유는 무엇입니까?

+1

코드를 더 게시하십시오. 특히 abs_yaw에 대해 실제로 어떤 값을 사용하고 float, double 등 어떤 데이터 유형 bs [Line]인지 확인하십시오. –

+0

가능성 1 : 로컬 변수에는 실제로 21.0f가 포함되지 않습니다. 가능성 2 :'abs_yaw'는 변수가 아니라 부작용이있는 표현식입니다. 가능성 3 : ** abs_yaw가 0.025 바로 위에 있다는 것을 ** 알지 못함 ** 실제로는 더 큽니다. –

+0

@Daniel 피셔 사실, 더 많은 코드를 사용하면 더 효과적으로 도움을받을 수 있습니다. –

답변

0

이 코드 :

#include <stdio.h> 

#define MIN(a,b) (((a) < (b)) ? (a) : (b)) 

int main(void) 
{ 
    for (int i = 0; i < 20; i++) 
    { 
     float abs_yaw = 0.022 + (i/4000.0); 
     float result = (21.0F - ((13.5F/0.035F) * (MIN(abs_yaw, 0.06F) - 0.025F))); 
     printf("%2d: %6.4f yields %10.6f\n", i, abs_yaw, result); 
    } 
    return 0; 
} 

맥 OS X 10.7.4에 GCC 4.7.1 이러한 결과를 얻을 수 있습니다.

0: 0.0220 yields 22.157143 
1: 0.0223 yields 22.060715 
2: 0.0225 yields 21.964285 
3: 0.0227 yields 21.867857 
4: 0.0230 yields 21.771429 
5: 0.0233 yields 21.674999 
6: 0.0235 yields 21.578571 
7: 0.0237 yields 21.482143 
8: 0.0240 yields 21.385714 
9: 0.0243 yields 21.289286 
10: 0.0245 yields 21.192858 
11: 0.0247 yields 21.096428 
12: 0.0250 yields 21.000000 
13: 0.0253 yields 20.903572 
14: 0.0255 yields 20.807142 
15: 0.0258 yields 20.710714 
16: 0.0260 yields 20.614286 
17: 0.0262 yields 20.517859 
18: 0.0265 yields 20.421429 
19: 0.0268 yields 20.325001 

당신은 당신의 가치에의 연마를 적용 할 수 있지만, 문제가해야처럼은 보이지 않는다, 당신은 생각할 수, 컴파일러의 버그를 발견 할 수 있습니다. OTOH, 당신의 테스트 코드는 아마 이것만큼 간단하지 않을 것이다; 이 방법을 사용하면 효과가있을 것입니다. 그래서, 아직 컴파일러 버그를 주장하지 마십시오. 다른 모든 것이 실패 할 때까지 코드에 오류가 있다고 가정합니다. 다른 컴파일러를 사용해보십시오 (동일한 코드에 대한 두 번째 의견을 얻으십시오).

+0

그는 임베디드 프로그래밍 중이며 변수의 프로세서 유형이나 정밀도를 지정하지 않으므로 16 비트 부동 소수점에서 비정규 값을 트래핑하고 0으로 플러시하거나 고정 소수점 수학을 대체 할 수 있기 때문에 사용할 수없는 경우 다른 컴파일러가이 문제를 반드시 도움이되지는 않습니다. OP는 실제로 지정하지 않습니다. –

+0

모든 유효한 포인트이지만 이것은 문제를 디버그하는 방법을 나타냅니다. 'printf()'도 없을 수도 있고, 임베디드 장치에 표시 할 방법이 없을 수도 있습니다. 어쩌면 에뮬레이터가있을 수 있습니다.하지만 문제가 컴파일러가 아닌 코드에 있다는 것을 납득시킬만한 많은 증거가 있어야합니다. 그리고 이와 같은 테스트 케이스가 많은 도움이 될 것입니다. –

+0

@ std''OrgnlDave 정치적으로 올바른 것은 아니지만 OP의 이름은 그녀임을 나타냅니다. –

0

왜 이런 일이 일어날 수 있습니까?

예 : 요 각도가 기호 반전을 트리거 완전한 원을 교차, 일부 다른 오류 (아마도 0.025 사용 가드 마진이 때문에 그 코드가 실행됩니다 때 코드에서 당신은 경우에 체크를 다른 곳?).

결과적으로 20 도가 아닌 360도 -20도를 얻습니다. 이것이 바로 -341 값의 출처입니다.

물론 코드를 보지 않고도 이는 단지 추측에 불과합니다. 그리고 내 자신의 과거 실수에 대한 기억.

+0

이것이 도박 사이트 인 경우이 답변에 대해 찬성표를 드리겠습니다. 그러나 OP에 충분한 정보가 없습니다. –

관련 문제