C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[38874] Re:+ - 연산 & * / %연산
열씸! [cappuccino] 1423 읽음    2005-01-22 09:44
FPU는 부동소수점 연산 장치입니다. 정수 연산에선 의미 없습니다.

정수를 먼저 예로 들죠
1. 덧셈과 뺄셈은 2의 보수 표현을 쓸 뿐이므로 사실상 같습니다.

2. 인텔 80486 이하의 CPU들에선 곱셈과 나눗셈은 비트연산이나 덧셈 연산들에 비해
확실히 느렸었습니다만. 펜티엄 이상에선 정수의 덧셈 곱셈이 거의 동일한 사이클에 수행됩니다.

3. / 나눗셈과 % 나머지는 똑같이 DIV(부호가 있을 경우 IDIV) 연산을 거치게 됩니다.
   DIV 연산의 결과 몫과 나머지가 분리되 두 개의 기억장소로 나뉘어 저장되는데
   그 둘 중 몫만 쓰는게 / 고, 나머지를 쓰는게 %죠.

4. 486 이하의 과거시절엔 비트 연산 두번에 덧셈을 섞는게 곱셈 나눗셈 보다 두배는 빨랐습니다.
   예를들어 성능을 고려한 코드에선 y * 640 을 하는 대신 (y << 9 ) + (y << 7) 을 했었죠.
   포팅성을 고려한다거나 인텔 호환 CPU에서의 발열 / 에너지 소모 문제를 고려한다고 해도
   상대적으로 간단한 instruction을 사용하는게 의미는 있지만,
   과거처럼 곱셈 한번을 몇개의 비트연산 조합으로 사용하는건 오히려 성능에 장애를 주죠.
   따라서 비트 연산 하나로 처리할 수 있는 연산들만 비트 연산을 사용하는게 좋습니다.

예>
   2의 승수 형태로 표현되는 값의 곱셈, 나눗셈, 나머지 연산
   a * 1024 ----> a << 10
   a / 64 ----> a >> 6
   a % 128 -----> a & 127

실수 연산의 경우를 잠시 언급하죠.

부동소수점 표현 매카니즘은 [부호 1비트 + 지수부 8비트 + 히든 비트 1 비트 + 가수부]
로 나뉘어 집니다. float 든 double 이든 long double 이든 말이죠.
이 매카니즘은 연산이 복잡하기 때문에, 펜티엄4라 하더라도 겔겔 대게 됩니다.
따라서 속도가 중요하다면 고정소수점(실은 정수) 형태로 변환해서 사용하셔야 하고,
함수 호출을 자제하고, 가능한 부분은 매크로함수로 정의하거나 인라인 함수, 인라인 어셈블리와
병행해서 처리하셔야 합니다.

고정소수점 최적화에 관한 내용은 게임 최적화 관련 문서들에서 흔히 접하실수 있습니다.

+ -

관련 글 리스트
38867 + - 연산 & * / %연산 김상면 834 2005/01/21
38874     Re:+ - 연산 & * / %연산 열씸! 1423 2005/01/22
38878         Re:Re:+ - 연산 & * / %연산 ==>감사합니다. 꾸벅[냉무] 김상면 1353 2005/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.