부동 소수점 정밀도 및 왜 여전히 사용합니까?


38

부동 소수점은 항상 큰 세계에서 정밀도를 유지하는 데 문제가되어 왔습니다.

기사 는 비하인드 스토리를 설명하고 확실한 대안-고정 소수점 수를 제공합니다. 다음과 같은 몇 가지 사실이 정말 인상적입니다.

"64 비트의 정밀도는 마이크로 미터 이하의 정밀도로 태양으로부터 먼 거리 (74 억 킬로미터)까지 가장 멀리 떨어진 명왕성에 도달하게합니다."

서브 마이크로 미터 정밀도는 위치 및 속도에 대한 fps의 요구 이상의 것이므로 실제로 큰 세계를 만들 수 있습니다.

내 질문은 고정 소수점에 이러한 이점이있는 경우 왜 여전히 부동 소수점을 사용합니까? 대부분의 렌더링 API 및 물리 라이브러리는 부동 소수점을 사용합니다 (그리고 단점이 있으므로 개발자가 해결해야합니다).

너무 느려요?

또한 outerra 또는 무한대와 같은 확장 가능한 행성 엔진이 어떻게 대규모를 처리한다고 생각하십니까? 위치에 고정 소수점을 사용합니까, 아니면 공간 분할 알고리즘이 있습니까?


3
마지막 "추가로"비트는 아마도 별도의 질문이어야하므로 주된 내용은 부수적이지 않습니다.
Tetrad

고정 소수점을 강제하는 방법을 알고 싶습니다 ... Lua가 FPU를 사용하고 DirectX가 FPU를 사용하기 때문에 게임에 이상한 오류가 있습니다 .2 * 9000 = 17995 또는 500 * 10과 같은 것을 보았습니다. = 4897 정말 바보입니다. 그러나 최악의 오류는 아마도 1 + 5 = 4 인 Ogre3D 포럼에서 논의 된 오류 일 것입니다.
speeder

3
의견을 정당화하지 않았다; 그러나 고정 소수점 Q-Floats ( en.wikipedia.org/wiki/Q_(number_format) ) 를 사용하기로 결정 했다면 친구입니다. 그들은 엄청나게 빠르고 구현하기 쉽습니다.
Jonathan Dickinson

그래서 요약하자면 Java 또는 Python에서 작업하는 경우 부동 소수점을 고수해야합니까? – Gastón 26 분 전
Gastón

답변:


20

내가 뻔뻔스런 플러그를 허용한다면, 내가 작업하고 있는 실제 게임 (YouTube 비디오 링크) 의 예를 들겠 다 .

이 게임은 물리 엔진에서 무한하고 절차 적으로 생성 된 세계를 가지고 있습니다. 단 정밀도 부동 소수점을 사용합니다. 수백 미터의 게임 공간이 지나면 정밀도 문제가 발생하기 시작합니다 (그리고 원점에서 멀어 질수록 점점 더 악화됩니다).

내 솔루션? 200m 정도마다 전 세계를 200m 정도 다시 원점으로 옮깁니다 (내 사이트에서 프로토 타입 중 하나를 찾아서 시도하고 [w] 오래된 디버그 오버레이를 표시하면 이런 일이 발생할 수 있습니다).

고정 소수점을 사용하지 않는 이유는 무엇입니까? 아니면 배정도? 단 정밀도 대신? 다른 모든 것이 단 정밀도 부동 소수점을 사용 하기 때문에 !

내가 사용하는 물리 엔진은 그것을 사용하고 XNA는 그것을 사용하며 그래픽 카드에로드 된 데이터는 단 정밀도 부동 소수점으로 포맷됩니다. 언어 자체 조차도 부동 소수점 숫자와 함께 작동하도록 설계되었습니다. 쓰기 및 (더 중요한 것은) 읽기 0.5f가 훨씬 쉽습니다 0x80000000L.

실제로 실제로 더 쉬운 문제입니다. 그리고 확실한 승자는 소수점 정밀도 문제를 떠와 인식하고있다 쓰는 아주 간단한 "이동 - 세계 - 다시 0으로"기능 (또는 공간 분할 또는 게임에 맞는 어떤 구현).

그리고 마지막으로 또 다른 예 -Orbiter 는 정밀도 (정확도)에 관심이 필요한 게임 (실제 시뮬레이션)입니다. 우주뿐만 아니라 시간에도 (시간 가속 + 궤도 체-하늘에서 떨어지기를 원하지 않습니다). 또한 부동 소수점 숫자를 사용 하고 안정성을 유지하기 위해 사용합니다 .


나는 항상 일부 응용 프로그램이 다른 모든 것을 옮기고 "플레이어"를 원점으로 유지하는 것이 더 쉬운 지 궁금했습니다 . 내가보기에 흥미 롭다!
dash-tom-bang

나는 당신의 추론을 좋아합니다. 네트워킹 고정 점을 포함하는 게임에 관해서는 단점 / 편차가 적습니다 (클라이언트 예측이 더 정확함).
Jonathan Dickinson

나는 당신의 주장을 잘 이해하지 못합니다. 그런데 왜 언어가 아직 고정 소수점을 구현하지 않았습니까? 물론 그것은 부동 소수점을 사용하기 위해 그려지는 이유 인 것처럼 보이지만 고정 소수점이 어디서나 구현되지 않은 이유를 설명하지는 않습니다.
jokoon

@ jokoon 나는 내 대답이 매우 분명하다고 생각했습니다. 왜 고정 소수점이 모든 곳에서 구현되지 않습니까? Wikipedia를 살펴보십시오. "대부분의 응용 프로그램에서 이진 또는 십진 부동 소수점 표현은 일반적으로 사용하기 쉽고 정확하기 때문에 고정 소수점 값에 대한 내장 지원을 거의 포함하지 않는 컴퓨터 언어는 거의 없습니다 ." 훌륭한 디자이너는 무엇을 생략해야하는지 알고 있으며, 프로그래머가 실제로 쉽게 발을 쏠 수있는 방식으로 기능을 복제하는 것이 좋습니다.
Andrew Russell

동의했다. 오늘날의 프로세서는 부동 소수점 명령어를 매우 쉽게 실행하며, 명령어는 처리량이 우수하며 대부분 정수 명령어보다 대기 시간이 몇 사이클에 불과합니다.
doug65536

11

첫째, 예, 훨씬 빠릅니다. "정상"FPU만큼 빠른 고정 소수점 작동을 얻을 수 있더라도 실제 부동 소수점에는 분기를 중지하기위한 fsel 또는 한 번에 많은 수레에서 작동하는 SIMD와 같은 유리한 명령이 있습니다. GPU는 또한 최소한 사용자 인터페이스에서 부동 소수점을 사용합니다.

두 번째로 64 비트는 부동 소수점에서도 상당히 멀리 떨어져 있습니다. 대부분의 사람들은 여전히 ​​32를 사용하지만 가장 큰 장점은 확장한다는 것입니다. 이 고정 소수점 스케일은 고정 정확도를 갖습니다. 태양을 명왕성까지 또는 거리를 가로 질러 측정하든 동일한 정밀도를 얻을 수 있습니다. 부동 소수점은 관련된 모든 값이 작을 때 훨씬 정확한 결과를 제공합니다. 일반적인 물리 라이브러리는 다른 규모의 많은 게임에서 최소한 수동으로 작동 할 것으로 예상되며 일부 게임 자체의 규모가 다를 수 있으므로 많은 규모에서 작동하는 일종의 숫자를 사용해야합니다.


5

또 다른 중요한 점은 여기 사람들이 생각하는 것처럼 수레가 부정확하지 않다는 것입니다. 32 비트 부동 소수점은 24 비트의 전체 정수 정밀도를 갖습니다. 이는 주어진 범위에 대해 적어도 24 비트 고정 소수점 값만큼 정확함을 의미합니다. 부동 소수점 값이 클수록 정확도는 떨어지지 만 고정 소수점 값은 단순히 오버플로되어 특정 지점에서 줄 바꿈됩니다. 정확도를 낮추는 것이 더 나은 대안입니다. 플로트도 오버플로 될 수 있지만 훨씬 늦습니다. 고정 소수점 오버플로로 인해 당신의 세계가 갑자기 -2 ^ 31로 줄어드는 순간 당신의 얼굴을보고 싶습니다.

64 비트 부동 소수점 값은 53 비트의 정수 정밀도를 가지므로 실제로 정확합니다.


부동 소수점 값은 실제로 오버플로되지 않습니다. 계산 결과가 너무 커서 표현하기에는 너무 크면 결과는 양 또는 음의 무한대입니다.
파인애플

3

FPS 컨텍스트에서 고정 소수점 값은 실제로 책임이 될 수 있습니다. 부동 소수점이 0에 가까울수록 더 정확합니다. 거리가 멀고 고정 점이 더 바람직하다. 답은 단순히 문맥에 달려 있다는 것입니다.

은하와 같은 것으로 기준 프레임을 사용할 수 있습니다. 태양계에 대해 대규모를 사용한 다음 태양 중심 (또는 유사한 점)을 시스템 내부의 모든 원점으로 사용하십시오. 이 시스템을 사용하면 케이크를 먹고 먹을 수 있습니다.

Infinity의 개발자 인 IIRC는 인터뷰 중 하나에서 규모 문제를 계속 반복하고 있다고 말했습니다.


모든 게임에서 부동 소수점의 "0에 근접한"정밀도가 필요할 것 같지 않습니다. 1 미터 단위의 경우 10 비트의 정밀도로 밀리미터 미만의 정확도를 제공하며 32 비트 값을 사용하는 경우 각 방향으로 4000km 이상 모델링 할 수 있습니다. 밀리미터보다 높은 정밀도가 필요한 경우 몇 비트를 더 이동할 수 있습니다. 우주 게임에서 64 비트 값으로 이동하면 전체 볼륨에서 일정한 정밀도로 태양계 (또는 그 이상)를 얻을 수 있습니다.
dash-tom-bang

과연. 그렇기 때문에 은하계의 세계에서 태양계의 태양을 기준으로 삼아야합니다! 요점은 선택한 정밀도 처리 방법으로 테이블에 아무것도 가져 오지 않습니다. 그것은 헛소리이므로 라이브러리 / 하드웨어가 조정 된 것을 사용할 수도 있습니다.
Rushyo

덧붙여서, 나는 우리가 각 방향으로 4000km가 넘는 모형을 만들어야하는 게임에서 일했다. 다른 프로젝트의 코드와의 호환성을 위해 위치에 32 비트를 사용해야했습니다. 오늘날 코드 재사용과 게임 세계의 크기에 대한 상업적 요구가 있기 때문에 이론적 인 문제는 아닙니다.

1

아직하지 않았다면 GameDev.net 에서 Planet Rendering 튜토리얼 을 확인하십시오 . 공간 분할의 경우 하나의 솔루션은 매크로 스케일과 마이크로 스케일의 두 가지 위치 변수를 유지하는 것입니다. 이것은 꽤 잘 작동합니다 (테스트).

정확한 솔루션은 엔진에서 극단 거리를 어떻게 처리 할 계획입니까? 점프 게이트 또는 시간 압축을 계획합니까?


1

그 이유 중 하나는 부동 소수점 산술이 "충분히"충분하거나 (또는 ​​적어도 그랬음) 상당히 정확한 결과를 빠르게 생성하기 때문입니다.

부동 소수점 산술의 한계를 알고 알고리즘에 맞게 알고리즘을 변경하면 (앤드류 러셀의 답변 참조) "작동하는"코드를 생성합니다.


-1

나는 게임을 쓰고있다. 게임 / 프로그램에서 상당히 고정 된 카메라를 사용하여 원점에서 우주선을 그리고 내 행성은 별도의 카메라를 사용하여 그립니다. 이 두 가지가 나를 위해 문제를 처리하지만 내 행성은 아직 상세하지 않습니다. 앤드류 러셀이 세상을 움직이는 것에 대해 언급 한 해결책에 관해서는 (그리고 카메라와 그 주민을 원점으로 되돌려 놓고 가정합니다) 게임을 네트워크 게임으로 만들 계획이라면 실제로 시도하지 않을 것입니다. 각 클라이언트 이동을 기반으로 서버 응용 프로그램에서 세상을 움직인다면 세상은 위치를 놓고 고군분투하게됩니다. 그리고 플레이하는 모든 사람들로부터 항상 그 위치를 차지할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.