Обнаружить длинные двойные переполнения во встроенных системах - PullRequest
1 голос
/ 12 марта 2011

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

Ответы [ 2 ]

1 голос
/ 14 марта 2011

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

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

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

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

0 голосов
/ 12 марта 2011

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

...