80 비트 확장 정밀 데이터 유형의 응용 프로그램/이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/612507

  •  03-07-2019
  •  | 
  •  

문제

예, 말하려고했습니다 80 비트. 오타가 아닙니다 ...

플로팅 포인트 변수에 대한 나의 경험에는 항상 싱글 (32 비트), 복식 (64 비트) 및 긴 복식 (96 비트 또는 128 비트)과 같은 4 바이트 배수가 포함되었습니다. 그래서 내가 만났을 때 내가 조금 혼란 스러웠습니다. 80 비트 확장 정밀 데이터 유형 내가 읽고 쓸 코드를 작업하는 동안 AIFF (오디오 교환 파일 형식) 파일: 오디오 트랙의 샘플링 속도를 저장하기 위해 확장 정밀 변수가 선택되었습니다.

Wikipedia를 훑어 보면 위의 링크를 발견했습니다. IEEE 754-1985 표준 요약 (그러나 IEEE 754-2008 표준 요약). 특정 아키텍처에서 "확장"및 "긴 이중"은 동의어 인 것으로 보입니다.

내가 얻지 못한 한 가지는 확장 정밀 데이터 유형을 사용하는 특정 응용 프로그램입니다 (물론 AIFF 파일 샘플링 속도 제외). 이것은 나를 궁금하게 만들었습니다.

  • 확장 된 정밀도가 필요한 상황을 발견 한 사람이 있습니까?
  • 80 비트 부동 소수점 번호의 이점은 무엇입니까?
  • 적용 가능성이 약화됩니까?
도움이 되었습니까?

해결책

Intel의 FPU는 내부적으로 80 비트 형식을 사용하여 중간 결과에 대한 정밀도를 높입니다.

즉, 32 비트 또는 64 비트 변수가있을 수 있지만 FPU 레지스터에로드되면 80 비트로 변환됩니다. FPU는 (기본적으로) 80에서 모든 계산을 수행합니다. 계산 후 결과는 32 비트 또는 64 비트 변수로 다시 저장됩니다.

BTW- 이것의 다소 불행한 결과는 디버그 및 릴리스 빌드가 약간 다른 결과를 낳을 수 있다는 것입니다. 릴리스 빌드에서 최적화는 80 비트 FPU 레지스터에 중간 변수를 유지할 수 있지만 디버그 빌드에서는 저장됩니다. 64 비트 변수에서 정밀도가 손실됩니다. 80 비트 변수를 사용하거나 FPU 스위치 (또는 컴파일러 옵션)를 사용하여 모든 계산을 64 비트로 수행하여 피할 수 있습니다.

다른 팁

나에게 80 비트의 사용이 필수적입니다. 이런 식으로 나는 벡터 내부 제품에 GOTO 라이브러리를 사용할 때 4 개의 수치를 가진 대칭 행렬의 고차 (30,000) 고유 값과 고유 벡터를 얻습니다. 음성 에너지 상태의 바다로 떨어지는 것을 피하기 위해 필요한 계산. 다른 옵션은 CPU 시간을 60-70 번 증가시키고 RAM 요구 사항을 증가시키는 4 중 사분면 산술을 사용하는 것입니다. 대형 벡터의 내부 제품에 의존하는 모든 계산은 도움이 될 것입니다. 물론, 레지스터 내에서 부분 내부 제품 결과를 유지하려면 GOTO 라이브러리에서와 같이 어셈블러 언어를 사용해야합니다. 이것이 내가 이전 Opteron 850 프로세서를 사랑하게 된 방법입니다. 계산의 해당 부분을 위해 지속되는 한 사용할 것입니다.

80 비트가 빠르지 만 정밀도가 훨씬 느려서 CPU의 표준 부동 소수점 하드웨어에는 80 비트 레지스터가 있기 때문입니다. 따라서 여분의 16 비트 (Mantissa 11 비트, 4 개의 추가 비트의 지수 및 1 개의 여분의 비트 효과를 효과적으로 사용하지 않음)를 원한다면 실제로 64 ~ 80 비트로 연장하는 데 비용이 많이 들지 않습니다. 80 비트 이상은 런타임 측면에서 매우 비용이 많이 듭니다. 따라서 원하는 경우 80 비트 정밀도를 사용할 수도 있습니다. 사용하는 데 드는 비용은 없지만 꽤 저렴합니다.

Wikipedia는 설명합니다 80 비트 형식은 정보를 잃지 않고 전체 64 비트 정수를 나타낼 수 있습니다. 따라서 CPU의 부동 소수점 단위는 정수에 대한 곱셈 및 분할을 구현하는 데 사용될 수 있습니다.

80 비트 유형에 대해서는 아직 언급되지 않은 또 다른 장점은 16 비트 또는 32 비트 프로세서에서 플로팅 포인트 장치가 없지만 피연산자 (16x16보다 2 배) 결과를 생성하는 "곱하기"명령이 있다는 것입니다. -> 32 또는 32x32-> 64), 64 비트 Mantissa의 산술은 4 개 또는 2 개의 16 비트 또는 32 비트 레지스터로 세분화 된 53 비트 Mantissa에서 산술보다 빠르지 만 레지스터 수가 있습니다. 표지판 및 지수와 12 개의 레지스터 비트를 공유합니다. 더 정확한 것이 필요하지 않은 응용 프로그램의 경우 float, 48 비트 "확장 플로트"유형의 계산은 마찬가지로 32 비트의 계산보다 빠를 수 있습니다. float.

어떤 사람들은 확장 프레시션 유형의 이중 라운드 동작을 불러 일으킬 수 있지만, 이는 전체 비트 비트 크로스 플랫폼 재현성을 요구하는 전문 애플리케이션에서 문제 일뿐입니다. an 정확성 관점에서, 64/128 대 65/128 또는 1024/2048ULP vs 1025/2048의 반올림 오차의 차이는 비 문제입니다. 언어로 확장 프리션 변수 유형 그리고 일관된 확장-정밀성 시맨틱, 플로팅 포인트 하드웨어 (예 : 임베디드 시스템)가없는 많은 플랫폼에서 확장 유형을 사용하면 단일 또는 이중 가격 부동 소수점 유형보다 정확도가 높고 속도가 향상됩니다.

나는 순수한 수학 연구에 80 비트를 사용했습니다. 나는 복식 범위 밖에서 상당히 큰 무한 시리즈로 용어를 합산해야했다. 수렴과 정확도는 문제가되지 않았으며 1E1000과 같은 대규모 지수를 처리하는 능력 만있었습니다. 아마도 일부 영리한 대수는 물건을 단순화했을 수 있지만, 정밀도로 알고리즘을 코딩하는 것이 더 빠르고 쉽고 쉽게 생각하는 것보다 시간을 보내는 것보다 더 빠르고 쉬웠습니다.

나는 그 일을하고있는 친구가 있습니다. 그는 기가 바이트 크기의 부동 소수점을 처리하기 위해 도서관에서 작업하고 있습니다. 물론, 과학 컴퓨팅 (혈장 계산)과 관련이 있으며 아마도 이런 종류의 컴퓨팅만이 큰 숫자와 함께 작동합니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top