2015-02-02 5 views
7

정수 값으로 부동 소수점을 반복적으로 반올림하기위한 C 코드를 작성했습니다. 표준 C 수학 라이브러리는 floor()ceil() 기능을 포함합니다. floor() 및 ceil() 함수와 C의 정수로 캐스팅 비교

int up, down; 
float test = 1.3548; 

up = (int)(test + 1); //ceil() 
down = (int)test;  //floor() 

내가 빠른 검사를했고이 잘 작동하는 것 같다 : 나는 기능을 훨씬 더 빨리 구현 정수로 직접 캐스팅하는 것으로 나타났습니다.

  1. 이 안정적 올림 방법 및 I 배열 인덱스로, 정수로 결과 필요하다면 다운 (즉 항상 올바른 결과를 반환한다)?
  2. 속도가 크게 향상되어야하는 이유가 있습니까? 음수가있을 때
+7

신뢰할 수있는 방법은 아닙니다. 'test'가'4.0'과 같은 정수 값 인 경우를 생각해보십시오. 이 경우'floor (x) == ceil (x)'이지만 코드는'up = 5; down = 4'이다. – njuffa

+1

정말 빠릅니까? 실적 테스트를 보여주세요! – Sulthan

+0

"신뢰할 수있는"의미에 따라 다릅니다. "신뢰할 수있는"은 "작동 할 것"을 의미하면 그렇습니다. 그러나 "항상 아래/위/가까운/제로/등 ..."과 같이 더 많은 것을 의미하는 경우에는 양수 및 음수에 대한 다양한 방법을 시도해야합니다. 무슨 일이 일어나는지 알기 위해서'int'의 범위를 벗어날 수있는 것들처럼 ... 당신의 특정 상황에 맞는 "올바른"방법을 선택할 수 있습니다 ... 오, 그리고 아마도'up = (int) (test + 0.5) '- 그것에 대해 생각해보십시오 ... – twalberg

답변

7

기능 ceil()floor()

up = (int)(test + 1); 
down = (int)test; 

를 사용하여 당신이 얻는 것보다 다른 번호를 반환합니다 (내 시스템에 약 3 배 빠른 math.h 구현보다 실행) 번호.

이있는 경우 :

float test = -1.3548; 
up = (int)test;  // ceil() 
down = (int)(test-1); // floor() 

심지어 마지막 문 test이 정수가있을 때 floor()을 계산하는 좋은 방법이 아니다.

양수와 음수를 다르게 처리하지 않고 test이 정수일 경우 특별한 경우가 아니면 ceil()floor()을 사용하는 것이 좋습니다.

+1

'round()'에 대해서 : (int) (test + 0.5f)' – Iggy

+3

'(int) (test - 1)'은 음수가 음수라면'floor() '와 동일하지 않습니다. –

+0

@ TheParamagneticCroissant, 훌륭한 지적. –