2014-09-17 5 views
0

저는 마이크로 컨트롤러 atmega168 (8 비트)을 프로그래밍하고 있습니다.이상한 부동 소수점 올림

float A = cos(- (2/3) * M_PI); 

포함하여 대신 -0.5을 갖는 과정 math.h (#DEFINE의 M_PI 3.14159265358979323846) 결과

,의, 내가 1

를 얻을 :

내가 좋아하는 뭔가를하고 싶어

나는 내 PC에 직렬 통신을 사용하여 결과를 확인한다. 설정 한 경우 플로트 번호로도 작동하기 때문에 확실하다.

A= -0.50; 

올바른 결과가 나타납니다.

추신. 나는 더블을 사용할 수 없다. 왜냐하면 내가 그 이유를 알지 못하기 때문이다.

도와주세요!

+4

표현식 '2/3'은 정수로 나누어 져 표현식 전체가 'float'에 할당 된 경우에도 '0'을 산출합니다. '(2.0/3.0)'을 시도해보십시오. –

답변

6

2/3은 정수 산술을 사용하여 계산됩니다. (가), 여기에 확장, 매크로입니다 M_PI 것을,

float A = cos(-(2.0f/3.0f) * M_PI); 

그러나 메모를 수행 : 그것은 당신이 float 리터럴는 f 접미사를 사용하려는 경우 포인트 격차

float A = cos(-(2.0/3.0) * M_PI); 

부동 사용하는 말은 당신 0으로 평가 더블 리터럴. 너가 원하는게 그거야?

실제 코드가 이처럼 보이지 않는다고 가정합니다. 이 코드가 실제로 코드라면 float A = -0.5f을 작성하고 계속 진행하십시오. 실제 코드에는 변수가있는 것 같습니다.

2

얼마나 정밀도가 필요하며 어디서 오는 숫자입니까? 목표가 120 도의 코사인을 계산하는 것이라면 a을 0.5로 설정하면됩니다. 원래 숫자가 라디안으로 표시되지 않고 절대적인 결과가 필요하지 않은 경우 표 크기 근사값은 내장 된 trig 함수보다 유용 할 수 있습니다. 테이블 크기, 실행 속도, 정밀도가 사용자의 요구에 가장 적합합니다. 원래 숫자가 정수인 경우 부동 소수점 값을 사용하지 않고 trig 함수를 계산할 수 있습니다. 하나는 0-65535의 각도를 받아들이고 -16384에서 +16384의 값을 반환하는 함수를 가질 수 있습니다. 정수 수학은 종종 부동 소수점보다 훨씬 빠르기 때문에 이러한 함수가 중요한 성능을 얻을 수 있습니다.