레거시 애플리케이션에 사용 된 고정 소수점 프로세서를 프로그래밍해야합니다. 새로운 기능이 요구되며 이러한 기능에는 스케일링 후에도 고정 소수점 범위를 넘어서는 큰 동적 범위가 필요합니다. 몇 가지 이유로 인해 프로세서가 변경되지 않으므로 고정 소수점 산술 - 기본적으로 소프트웨어 기반 접근 방식을 기반으로 한 부동 소수점 연산을 통합 할 계획입니다. 기본 고정 소수점 프로세서에서 C로 부동 소수점 숫자를 나타내는 데 필요한 데이터 구조를 정의하고 싶습니다. 전혀 할 수 있습니까? IEEE floating point representation을 사용할 계획입니다. 어떤 종류의 데이터 구조가 곱셈, 나눗셈, 덧셈 및 덧셈과 같은 기본 연산을 달성하기에 좋을까요? 이미 C/C++에서 사용할 수있는 오픈 소스 라이브러리가 있습니까?고정 소수점 프로세서에서 부동 소수점 연산을위한 데이터 구조
답변
데이터 구조가 필요하지 않습니다. 정수를 사용하여 부동 소수점 인코딩 및 정수를 나타 내기 만하면 비 압축 부호, 지수 및 significand 필드를 나타낼 수 있습니다.
당신이 묘사 한 것은 암시 적 관행에 위장한 본격적인 수업입니다. 의미 :이 작업을 수행하려면 데이터 구조가 필요합니다. – xtofl
당신은 * 사소한 * 데이터 구조가 필요하지 않습니다. 우리는 그것에 중점을두고 있지만, 클래스는 데이터 구조가 아니며, 당면의 문제에 대해서는 클래스를 사용하지 않아도됩니다. –
부동 소수점 연산은 일반적으로 부호, 지수 및 가수를 별도로 사용하고 변경해야합니다. 하나의 32 비트 비트 패턴으로 데이터 구조를 압축하면 명시 적으로 세 필드를 저장하는 것과 비교하여 많은 불필요한 추출 및 병합이 필요합니다. –
네이티브 부동 소수점 지원이없는 마이크로 컨트롤러 용 C 개발 도구는 부동 소수점 연산을위한 소프트웨어 라이브러리를 제공합니다. 어셈블러에서 프로그래밍을하더라도, 아마 그 라이브러리를 사용할 수 있습니다. (단지 궁금 해서요, 어떤 프로세서와 어떤 개발 도구를 사용하고 있습니까?)
그러나 자신 만의 부동 소수점 라이브러리를 작성하는 것이 가장 효율적인 방법은 루틴을 정수에서 작동하는 루틴으로 취급하는 것입니다. union을 사용하거나 다음과 같은 코드를 사용하여 부동 소수점 표현과 정수 표현간에 변환 할 수 있습니다. 부동 소수점 숫자의 형식은 C 표준에 명시되지 않는 한이 본질적 정의되지 않은 동작 것을
는uint32_t integer_representation = *(uint32_t *)&fvalue;
참고.
문제로 그런 식으로 당신이 예를 들어, 일반 정수 루틴과 루틴을 볼 수있다 (일반적으로 32 개 또는 64 비트 유형)와 일치 부동 소수점 및 정수 유형의 당신이 붙어 있다면 훨씬 더 쉽습니다 또한은 부동 소수점 값의 두 개의 32 비트 정수 표현을 사용하여 결과의 32 비트 정수 표현을 반환합니다. 당신이 자신을 루틴을 사용하는 경우
또한, 당신은 아마 등 예외 플래그, 비정규 번호, NaN의에서 INF 등의 표준 구현되지 않은의 떠나는 부품, 멀리 얻을 수
소수점 에뮬레이션 라이브러리를 떠있는이 사용 모든 플랫폼에서 사용할 수 있습니다. 그들 중 일부는 여전히 Google을 통해 주위에 떠 있어야합니다. –