IT TIP

2 개의 "float"를 사용하여 "double"을 에뮬레이션

itqueen 2020. 12. 11. 21:07
반응형

2 개의 "float"를 사용하여 "double"을 에뮬레이션


32 비트 단 정밀도 부동 소수점 산술 만 지원하는 임베디드 하드웨어 용 프로그램을 작성 중입니다. 그러나 구현중인 알고리즘에는 64 비트 배정 밀도 추가 및 비교가 필요합니다. double두 개의 튜플을 사용하여 데이터 유형 을 에뮬레이션하려고합니다 float. 따라서 a double dstruct튜플을 포함하는 것으로 에뮬레이션됩니다 (float d.hi, float d.low).

비교는 사전 식 순서를 사용하여 간단해야합니다. 그러나 어떤베이스를 사용해야하는지 잘 모르겠 기 때문에 추가는 약간 까다 롭습니다. 그럴까요 FLT_MAX? 캐리를 어떻게 감지 할 수 있습니까?

어떻게 할 수 있습니까?


편집 (명확성) : 추가 범위가 아닌 추가 유효 숫자가 필요합니다.


double-float는 단 정밀도 숫자 쌍을 사용하여 단 정밀도 지수 범위의 약간의 감소와 함께 단 정밀도 산술의 거의 두 배의 정밀도를 달성하는 기술입니다 (범위의 먼 끝에서 중간 언더 플로 및 오버플로로 인해). . 기본 알고리즘은 1970 년대 TJ Dekker와 William Kahan에 의해 개발되었습니다. 아래에는 이러한 기술이 GPU에 어떻게 적용될 수 있는지 보여주는 최근의 두 문서가 나열되어 있지만이 문서에서 다루는 자료의 대부분은 플랫폼과 무관하게 적용 가능하므로 당면한 작업에 유용해야합니다.

https://hal.archives-ouvertes.fr/hal-00021443 Guillaume Da Graça, David Defour 그래픽 하드웨어에서 float-float 연산자 구현, 실수 및 컴퓨터에 대한 7 차 컨퍼런스, RNC7.

http://andrewthall.org/papers/df64_qf128.pdf Andrew Thall GPU 계산을위한 확장 정밀도 부동 소수점 숫자.


이것은 간단하지 않을 것입니다.

부동 소수점 (IEEE 754 단 정밀도)에는 1 개의 부호 비트, 8 개의 지수 비트 및 23 비트의 가수 (음, 사실상 24 비트)가 있습니다.

double (IEEE 754 배정 밀도)에는 1 개의 부호 비트, 11 개의 지수 비트 및 52 비트의 가수 (효과적으로 53)가 있습니다.

부동 소수점 중 하나에서 부호 비트와 8 지수 비트를 사용할 수 있지만 다른 하나에서 지수 비트 3 개와 가수 29 비트를 어떻게 얻을 수 있습니까?

다른 누군가가 영리한 것을 생각 해낼 수도 있지만, 제 대답은 "이것은 불가능합니다"입니다. (또는 적어도 "64 비트 구조체를 사용하고 자체 작업을 구현하는 것보다 쉽지 않습니다.")


수행하려는 작업 유형에 따라 다릅니다. 덧셈과 뺄셈에만 관심이 있다면 Kahan Summation 이 훌륭한 솔루션이 될 수 있습니다.


정밀도와 넓은 범위가 모두 필요한 경우 SoftFloat 와 같은 배정 밀도 부동 소수점의 소프트웨어 구현이 필요합니다 .

(추가적으로 기본 원칙은 각 값의 표현 (예 : 64 비트)을 기호, 지수 및 가수의 세 가지 요소로 분리 한 다음 지수의 차이에 따라 한 부분의 가수를 이동하거나 부호 비트를 기준으로 다른 부분의 가수에서 빼고, 가수를 이동하고 그에 따라 지수를 조정하여 결과를 재 정규화 할 수 있습니다. 그 과정에서 불필요한 손실을 피하기 위해 설명해야 할 까다로운 세부 사항이 많이 있습니다. 무한대, NaN 및 비정규 화 된 숫자와 같은 특수 값을 처리합니다.)


23 개 이상의 높은 정밀도에 대한 모든 제약을 감안할 때 가장 유익한 방법은 사용자 지정 산술 패키지를 구현하는 것입니다.

간단한 설문 조사에 따르면 Briggs의 doubledouble C ++ 라이브러리가 귀하의 요구 사항을 해결해야한다는 것을 보여줍니다 . 참조 이것을 . [*]의 기본 구현을 기반으로 double30도 상당한 계산을 달성 할 수 있지만 쉽게 사용 재기록 float(13 개) 또는 (14)의 유효 숫자를 달성했다. 비슷한 크기 값을 가진 덧셈 작업을 분리하고 마지막 작업에서 극단 값 만 추가하는 데주의를 기울이면 요구 사항에 충분할 수 있습니다.

그러나 주석에는 x87 제어 레지스터가 엉망이라고 언급되어 있습니다. 세부 사항을 확인하지는 않았지만 코드를 사용하기에 너무 이식성이 떨어질 수 있습니다.


[*] C ++ 소스는 해당 기사에 링크되어 있지만 gzip으로 압축 된 tar 만 데드 링크가 아닙니다.


실용적이지 않습니다. 그렇다면 모든 임베디드 32 비트 프로세서 (또는 컴파일러)는이를 수행하여 배정 밀도를 에뮬레이트합니다. 지금은 내가 아는 한 아무도하지 않습니다. 대부분 단지 대체 float를 위해 double.

다이나믹 레인지가 아닌 정밀도가 필요한 경우 고정 소수점을 사용하는 것이 가장 좋습니다. 컴파일러가 64 비트를 지원한다면 이것도 더 쉬울 것입니다.


사용할 수있는 또 다른 소프트웨어 기반 솔루션 : GNU MPFR
다른 많은 특수 사례를 처리하고 사용자가 직접 처리해야하는 임의 정밀도 (64 비트 double보다 더 좋음)를 허용합니다.


이것은 하드웨어 계산 지원 하는 일부 컴퓨터에서 많은 컴파일러가 사용 하는 double-double 산술 과 유사합니다 . 또한 지원 되지 않는 구형 NVIDIA GPU에서 부동 부동으로 사용됩니다 . GPU에서 2 개의 FP32로 FP64 에뮬레이션을 참조하십시오 . 이렇게하면 계산이 소프트웨어 부동 소수점 라이브러리보다 훨씬 빠릅니다.long doubledoubledouble

그러나 대부분의 마이크로 컨트롤러에는 s에 대한 하드웨어 지원이 float없으므로 순전히 소프트웨어로 구현됩니다. 그 때문에, 사용 float-float할 수 없는 성능을 향상시키고 지수의 추가 바이트를 저장하는 오버 헤드가 일부 메모리를 소개합니다.

더 긴 가수가 정말로 필요한 경우 사용자 정의 부동 소수점 라이브러리를 사용해보십시오. 예를 들어 가수 40 비트와 지수 7 비트 만 필요한 경우 새로운 48 비트 부동 유형을 적용하도록 라이브러리를 변경하는 등 충분한 것을 선택할 수 있습니다. 더 이상 불필요한 16 비트를 계산 / 저장하는 데 시간을 할애 할 필요가 없습니다. 그러나 컴파일러의 라이브러리는 종종 자체 유형의 float에 대한 어셈블리 수준 최적화를 갖기 때문에이 라이브러리는 매우 효율적이어야합니다.

참고 URL : https://stackoverflow.com/questions/6769881/emulate-double-using-2-floats

반응형