단정밀도 부동 소수점을 사용한 배정밀도 산술 에뮬레이션
부동 소수점 기능이 제한된 임베디드 시스템 영역에서 필요성이 대두됩니다. 단정밀도 데이터 구조를 사용하여 배정밀도 데이터 구조를 에뮬레이트합니다. 이 기사에서는 단정밀도 부동 소수점 쌍을 사용하여 배정밀도 덧셈 및 비교 연산을 구현하는 문제를 다룹니다.
비교
두 개의 에뮬레이트된 배정밀도 값을 비교하는 것은 간단한 작업입니다. . 우리는 튜플 요소를 순차적으로 비교하는 사전순 정렬을 사용합니다. (d1.hi > d2.hi) OR ((d1.hi == d2.hi) AND (d1.low > d2.low))
더하기
배정밀도 덧셈을 에뮬레이트하는 것이 더 까다롭습니다. 사용할 베이스와 캐리를 감지하는 방법을 결정해야 합니다.
베이스 선택
FLT_MAX는 원치 않는 오버플로 및 언더플로 문제를 유발하므로 적합하지 않은 베이스입니다. 대신, 지수 범위는 더 크지만 정밀도는 감소한 부동 소수점 형식("이중 부동 소수점"이라고 함)을 채택합니다.
캐리 감지
d1 및 d2는 추가할 두 개의 에뮬레이트된 double 값입니다. 먼저 d1.hi와 d2.hi를 합산합니다.
result.hi = d1.hi + d2.hi
result.hi가 오버플로되면 캐리가 있음을 알 수 있습니다. 이 경우 result.hi를 1만큼 감소시키고 result.low에 1을 추가합니다. result.hi가 언더플로되면 1씩 증가시키고 result.low에서 1을 뺍니다.
if (result.hi overflowed) { result.hi--; result.low++; } else if (result.hi underflowed) { result.hi++; result.low--; }
그런 다음 d1.low 및 d2.low를 result.low에 추가합니다.
result.low += d1.low + d2.low
result.low가 오버플로되면 result.hi가 1씩 증가합니다. 언더플로가 되면 result.hi가 1씩 감소합니다.
if (result.low overflowed) { result.hi++; } else if (result.low underflowed) { result.hi--; }
마지막으로 (result.hi를 사용하여 에뮬레이트된 double 결과를 반환합니다. , result.low).
Dekker와 Kahan의 작업을 기반으로 한 이 방법론을 사용하면 단정밀도 산술이 제한된 환경에서 합리적인 정확성과 효율성으로 배정밀도 덧셈을 에뮬레이션할 수 있습니다.
위 내용은 임베디드 시스템에서 단정밀도 부동 소수점을 사용하여 배정밀도 덧셈을 어떻게 에뮬레이트할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!