Как выполнить вычисление гипотез 2 (x, y), когда числа могут переполняться

Я хотел бы выполнить вычисление гипотезы 2 на 16-битном процессоре.

Стандартная формула c = sqrt ((a * a) + (b * b)) . Проблема заключается в том, что при больших входных данных происходит переполнение. Например 200 и 250, умножьте 200 * 200, чтобы получить 90 000, что выше максимального значения со знаком 32 767, поэтому оно переполняется, как и b, числа складываются, и результат также может быть бесполезным; он может даже сигнализировать об ошибке из-за отрицательного sqrt.

В моем случае я имею дело с 32-битными числами, но 32-битное умножение на моем процессоре происходит очень быстро, около 4 циклов. Я использую микроконтроллер dsPIC. Я бы предпочел не умножать на 64-битные числа, потому что это тратит драгоценную память и, несомненно, будет медленнее. Кроме того, у меня есть только sqrt для 32-битных чисел, поэтому для 64-битных чисел потребуется другая функция. Итак, как я могу вычислить гипотезу, когда значения могут быть большими?

Обратите внимание, я действительно могу использовать для этого только целочисленную математику. Использование чего-либо вроде математики с плавающей запятой приводит к падению скорости, чего я бы предпочел избежать. Мой процессор имеет быструю процедуру atan2 с целыми числами и фиксированной точкой, около 130 циклов; Могу я использовать это для вычисления длины гипотенузы?

6
задан Thomas O 7 December 2010 в 21:25
поделиться