Programing

long double vs double

crosscheck 2020. 12. 2. 08:01
반응형

long double vs double


내가 사용하는 시스템에 따라 다양한 데이터 유형의 크기가 변경 될 수 있음을 알고 있습니다. XP 32 비트를 사용하고 C ++에서 sizeof () 연산자를 사용하면 long double은 12 바이트이고 double은 8 인 것처럼 보입니다.

그러나 대부분의 주요 소스에 따르면 long double은 8 바이트이므로 범위는 double과 동일합니다.

어떻게 12 바이트가 있습니까? long double이 실제로 12 바이트이면 값의 범위도 확장되지 않습니까? 또는 long 서명은 값이 double 범위를 초과하여 8 바이트 이상으로 확장 될 때만 사용됩니까 (컴파일러 수치)?

감사합니다.


Wikipedia 에서 인용 :

x86 아키텍처에서 대부분의 컴파일러는 해당 하드웨어에서 지원하는 80 비트 확장 정밀도 유형 (데이터 구조를 유지하기 위해 12 또는 16 바이트로 저장되는 경우도 있음)보다 long double을 구현합니다.

컴파일러는 현재 소프트웨어에서 구현되는 128 비트 4 중 정밀도 형식에 long double을 사용할 수도 있습니다.

즉, 예, a long double a보다 더 큰 범위의 값을 저장할 있습니다 double. 그러나 그것은 완전히 컴파일러에 달려 있습니다.


x64의 최신 컴파일러의 경우 Clang 및 GCC는 16 바이트 double을 사용 long double하는 반면 VC ++는 8 바이트 double을 사용합니다. 즉, Clang 및 GCC를 사용하면 더 높은 정밀도의 배정 밀도를 얻을 수 있지만 VC ++의 long double경우 double. 최신 x86 CPU는 이러한 16 바이트 더블을 지원하므로 Clang과 GCC가 옳은 일을하고 있다고 생각하며 더 높은 수준의 언어 프리미티브를 사용하여 더 낮은 수준의 하드웨어 기능에 액세스 할 수 있습니다.


숫자의 표준 바이트 크기는 모든 플랫폼에서 보장되는 최소 크기입니다. 일부 시스템에서는 더 클 수 있지만 결코 작아지지는 않습니다.


내 프로그래밍 초보자 경험에 관한 한 다음과 같습니다.

  • 주기적으로 정규화 된 float 사용 [-1.0, + 1.0]

  • double 또는 long double로 정규화 값을 별도로 유지

  • 정규화는 변수 값에 노이즈 = 작은 오류 = 고 빈도를 도입합니다.

  • 때때로 중앙값을 별도로 유지하고 데이터를 정렬하여 정규화하는 것이 유용합니다 (원래 데이터 순서는 순열 벡터로 저장 될 수 있음).

참고 URL : https://stackoverflow.com/questions/3454576/long-double-vs-double

반응형