Обнаружение длинных двойных переполнений во встроенных системах

Я собираюсь использовать большие числа в коде C++ во встроенной системе. К счастью, компилятор распознает длинные двойные числа.
Я не могу использовать стандартные библиотеки, библиотеки повышения, математические библиотеки gnu и т. д. И система не имеет встроенного процессора математики с плавающей запятой.
Теперь, как я могу обнаружить длинные двойные переполнения ?


person Hossein    schedule 12.03.2011    source источник


Ответы (2)


Поскольку это не стандартный C++, вам придется полагаться на методы, предоставляемые вашей конкретной средой. Изготовитель встроенной системы должен был задокументировать, как это можно сделать. Спроси его.

person Oswald    schedule 12.03.2011
comment
Конкретных методов не предусмотрено. Это процессор SH3, и в документации компилятора упоминается только диапазон длинных двойников, но не то, как обнаружить их переполнение. Мне не нужны прерывания, чтобы поймать их, проверка переполнения после каждой операции для меня в порядке. я просто не знаю как?? - person Hossein; 12.03.2011
comment
Тот факт, что это SH3, является важной информацией. Вы должны добавить это к своему вопросу. Я мог бы сказать вам, что если результат операции над long double слишком велик для представления, тогда результатом должен быть NaN, а NaN — единственное значение long double, для которого value == value равно false. Но это всего лишь дикие предположения, потому что я не знаю ни этого конкретного процессора, ни используемого вами компилятора. - person Oswald; 12.03.2011

Вы заявляете, что вам нужны «большие числа», но это не обязательно означает, что указано использование long double. В большинстве встроенных приложений, о которых я знаю, long double выбирается из-за его повышенной точности, т. е. большего разрешения для дробных чисел, чем из-за его увеличенного диапазона.

Вы также заявляете, что ваша реализация предлагает мало обычных библиотек и/или функций с плавающей запятой. Основываясь на этих заявлениях, я бы поставил под сомнение, нужны ли вам полнофункциональные возможности с плавающей запятой. Если ваши опасения ограничиваются "большими числами", проверьте, поддерживает ли ваш компилятор тип данных long long, который представляет собой 64-битное целое число.

Если вам нужны некоторые возможности с плавающей запятой, вы можете рассмотреть реализацию с фиксированной запятой. Предполагая длинный длинный, вы можете выбрать представление чисел в формате 48.16, что позволит использовать числа ~ 2,8x10 ^ 14 с 16 битами справа от десятичного числа. (Если вам нужно введение в вычисления с фиксированной точкой, начните с здесь.)

Обсудив некоторые фоновые вопросы, давайте рассмотрим исходный вопрос. Если вы хотите обнаружить переполнение в беззнаковом целом (что я обычно делаю в своей работе со встроенными модулями), достаточно сравнить ваш последний результат с предыдущим. Например, мое приложение требует, чтобы я периодически проверял 16-битный счетчик, который управляется внешними часами. Если мое текущее наблюдение меньше, чем последнее наблюдение, то я могу предположить, что 16-битный счетчик переполнился, и я могу принять соответствующие меры. Если вы реализуете свои большие числа, используя тип данных long long integer, вы можете применить аналогичную стратегию для обнаружения переполнения.

person Throwback1986    schedule 13.03.2011