[GPG 3 글 2.2] 부동 소수점의 오차.... 어떻게 해결해야 할까요?

수학, 물리학 등 게임 프로그래밍의 기반이 되는 이론에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

부동 소수점의 오차.... 어떻게 해결해야 할까요?

Post by 비회원 »

P2P게임을 개발중입니다. 물론 프레임 동기화를 했구요.
로그를 남겨보니
AMD컴퓨터들 만으로, Intel 컴퓨터만으로 작업은 아무런 문제없이 소수점 모든 자릿수가 맞았습니다.
하지만 다른 CPU 즉, AMD와 Intel을 같이 돌렸을때는 소수점의 오차가 생겨나서 결과가 달라지더군요.
각 회사마다의 FPU때문에 같은 소수도 다르게 표현이 되나요?
참고로 모든 계산은 float를 썼습니다.
만약 이렇게 오차가 있다면 그에대한 해결책은 무엇이 있을까요?
모든 계산을 전부다 정수로 바꿔 나중에 출력할때만 float으로 바꾸는게 있을지도 모르겠지만..
이 작업이 사실 만만치 않습니다.
조언부탁드립니다.~
raonhaje
Posts: 65
Joined: 2004-06-22 21:22
Location: 마이에트 엔터테인먼트
Contact:

음..

Post by raonhaje »

오래되서 자세히 기억은 안납니다만 부동소수점의 유효범위를 명시적으로 설정할수가 있습니다.

아마 _controlfp() 였던가 그럴겁니다.

코드로 명시해주고나면 Intel, AMD 똑같이 동작합니다.
비회원

Post by 비회원 »

WinMain에서.. 아래와 같이 명시해 주고 실행해봤지만...
소수자릿수 14정도번째부터 달라지더군요.
어디 좋은 방법 없을까요?

_controlfp( _PC_24, _MCW_PC );
_controlfp( _RC_UP, _MCW_RC );
_controlfp( _IC_AFFINE, _MCW_IC );
jeddli
Posts: 138
Joined: 2001-08-06 09:00
Location: NeowizGames

그정도의 정밀도라면...

Post by jeddli »

비회원 wrote:WinMain에서.. 아래와 같이 명시해 주고 실행해봤지만...
소수자릿수 14정도번째부터 달라지더군요.
어디 좋은 방법 없을까요?

_controlfp( _PC_24, _MCW_PC );
_controlfp( _RC_UP, _MCW_RC );
_controlfp( _IC_AFFINE, _MCW_IC );
소숫점 14자리정도되면 float 표현의 한계로 인한 문제가 생길수밖에 없을듯 합니다.
이것과 관련해서 스케일이 아주큰 월드에서 이러한 문제를 해결하긴 위한 애기가
GPG4 2.3.장 커다른 세계 좌표의 정밀도 문제 해결 이란 부분이 도움이 좀 될수 있을듯 합니다.
( 내용중에 100km 제곱정도 되는 월드를 32비트 float 로 표현을 한다면 아무리 해봐야
7.8mm 이하로는 표현이 불가능 하다는 애기가 나옵니다. 이건 본질적으로 표현의 한계이니
일단 이부분의 문제부터 해결을 해야하실듯 합니다. )
zupet
Posts: 2764
Joined: 2003-05-13 03:34
Location: NCSOFT LE팀

정확한 기하학을 위한 벡터 분수의 활용

Post by zupet »

안녕하세요. 매크로 없는 메비~랍니다.

최악의 경우 쓸 수 있는건 GPG3 권에 있는 <b>정확한 기하학을 위한 벡터 분수의 활용</b> 가 아닐까 싶습니다. PathEngine 을 팔아먹고 있는 토마스 영~ 이란 아저씨가 쓴 자료로 PathEngine 에도 같은 기하학 표현법이 사용되고 있다고 하죠.
비회원

굉장히 정밀도를 요구하는 프로젝트군요..

Post by 비회원 »

소수점 14자리라... 저로서는 딱히 감이 와 닿질 않네요..
IEEE표준에서 제정한 부동 소수점 자체가 매우 근사치적인 방식인지라..
님께서 진행하고 계시는 프로젝트쯤 되면 현재로선 답이 안나올거 같네요..
threshold를 적용할수는 없는 부분인가요?
362496
Posts: 91
Joined: 2001-11-09 09:00

Post by 362496 »

_PC_24 대신 _PC_64 로 해서 해보시고,
그래도 정밀도가 딸려서 오차가 발생하면 float 를 double 로 바꿔보십시오.
기본적으로 float 를 쓴 이상은 유효 숫자 7개 넘어서는 정밀도가 보장되지 않는다고 봐야 합니다.
Locked