2012-02-12 2 views
2

저는 인터페이스, 게임 등을 만드는 데 사용되는 다용도 C++ 수학 라이브러리를 설계하고 있습니다. 불행히도 나는 디자인 딜레마에 빠지며 의견이 필요하다. 수학 라이브러리에는 일반적인 Vector, Math, Matrix 클래스가 포함되어 있지만 수레 또는 복식을 사용할지 여부는 결정할 수 없습니다.데이터 유형 설정

누군가 모든 플로트 또는 모든 이중으로가는 데 몇 가지 단점을 열거 할 수 있습니까? 세상은 모든 복식을 사용하는 방향으로 가고 있습니까? 나는 심지어 수레를 괴롭혀 야합니까?

이 점을 염두에 두어야 할 건축상의 장점은 무엇입니까? 예를 들어, double을 사용하면 64 비트 시스템에서 사용하는 것이 더 좋고, 32 비트 시스템에서는 float가 더 좋을 것입니다 (SIMD 연산은 어떻습니까?)

이러한 시스템을 설계하는 가장 좋은 방법은 무엇입니까?

  1. 템플릿을 사용
  2. 사용 타입 정의

이 당신이 유형을 변경할 수 있습니다 :

+4

Simple : 템플릿을 사용하십시오. 그렇게하면 두 가지 모두 허용 할 수 있습니다. –

답변

1

당신은 두 가지 옵션이 있습니다. 두 가지 유형을 모두 사용하는 것보다 하나만 사용하는 것이 좋습니다.

+0

그것들은 과거에 저의 두 가지 접근 방식이었습니다 (보다 일반적인 라이브러리를위한 템플릿, 애플리케이션 별 클래스의 typedef). 내 가장 큰 문제는 typedef 유형에 대한 좋은 이름을 찾는 것이었다. – aib

+0

@ aib : 'T'및 'value_type'이 공통적입니다. –

+0

'typedef float T;'? 아니, 나는'float_t'라고 이름을 짓고 typedef를'common.h' 또는'application.h' 파일에 넣는 것이 좋을 것이라고 생각합니다. – aib

1

엔지니어링 또는 과학 관련 작업이고 고정밀 결과가 필요한 경우가 아니면 그래픽 프로그래밍을 위해 double을 사용하는 이점이 없습니다. Stick with float.

게임 엔진은 거의 보편적으로 float을 사용합니다. CPU는 기본적으로 높은 정밀도로 작업하는 경향이 있지만 GPU는 지정한 정확도로 작동하며 으로 작업하는 것이 훨씬 더 빠릅니다. double보다 빠릅니다. 마찬가지로 SIMD 명령어 세트도 마찬가지입니다. OpenGL ES 1.1 및 2.0은 double도 지원하지 않습니다.

0

내가 사용하는 Microsoft 컴파일러에는 float 수학 라이브러리가 없습니다. float를 수학 함수에 전달하면 double로 승격됩니다. 그런 다음 결과를 부동으로 다시 캐스팅해야합니다. 그래서, 당신은 어디서나 이중으로 갈 수도 있습니다. (이 환경에있는 경우).

[편집] 물론 부동 소수점 값이 10,000 개이면 float를 사용하면 상당한 양의 메모리를 절약 할 수 있습니다.

+0

이상한 SKU가 있어야합니다. Visual Studio의 사본에는 sinf, tanf, atan2f 등이 있습니다.또한 지정된 정밀도를 사용하여 명시 적으로 계산하는 SIMD 내장 함수도 있습니다. –

+0

@MarceloCantos : C++ 수학 라이브러리 함수 중 일부는 부동 소수점 오버로드가 없다고 생각합니다. C 수학 라이브러리 함수를 나열했습니다. –

+0

@MooingDuck : 내가 보았던 모든 것은 float에 대한 C++ 오버로드를 가지고 있습니다 (fmod, sin, cos, asin, tan, atan, atan2, log, log10, exp). 어느 것을 생각하고 있니? –

0

플로트가 작아서 (메모리에서 읽고 쓰기가 더 빠르며 그래픽 카드에서 /로 전송하는 것이 더 빠름), 특정 연산 (나누기 및 제곱근)에 더 빠르며, 4 개의 부동은 단일 SIMD 레지스터에 균일하게 맞습니다 (동질 좌표) 게임에 적합한 정밀도를 유지해야합니다. 32/64 비트 시스템에서는 float/double간에 속도 차이가 없습니다.

결론적으로 : 플로트 스틱. typedef float CoordinateType과 같은 typedef를 사용할 수 있습니다.