>백엔드 개발 >C++ >임베디드 시스템에서 단정밀도 부동 소수점을 사용하여 배정밀도 덧셈을 어떻게 에뮬레이트할 수 있나요?

임베디드 시스템에서 단정밀도 부동 소수점을 사용하여 배정밀도 덧셈을 어떻게 에뮬레이트할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-10-31 08:02:29390검색

How can double-precision addition be emulated using single-precision floats in embedded systems?

단정밀도 부동 소수점을 사용한 배정밀도 산술 에뮬레이션

부동 소수점 기능이 제한된 임베디드 시스템 영역에서 필요성이 대두됩니다. 단정밀도 데이터 구조를 사용하여 배정밀도 데이터 구조를 에뮬레이트합니다. 이 기사에서는 단정밀도 부동 소수점 쌍을 사용하여 배정밀도 덧셈 및 비교 연산을 구현하는 문제를 다룹니다.

비교

두 개의 에뮬레이트된 배정밀도 값을 비교하는 것은 간단한 작업입니다. . 우리는 튜플 요소를 순차적으로 비교하는 사전순 정렬을 사용합니다. (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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.