2009-03-03 5 views
0

Я пытаюсь реализовать операции с плавающей точкой в ​​микроконтроллере, и до сих пор у меня был большой успех.Умножение 23-битных типов данных в системе с длинными длинными

Проблема заключается в том, что я делаю умножение на моем компьютере, и она отлично работает:

unsigned long long gig,mm1,mm2; 
unsigned long m,m1,m2; 
mm1 = f1.float_parts.mantissa; 
mm2 = f2.float_parts.mantissa; 

m1 = f1.float_parts.mantissa; 
m2 = f2.float_parts.mantissa; 



gig = mm1*mm2; //this works fine I get all the bits I need since they are all long long, but won't work in the mcu 

gig = m1*m2//this does not work, to be precise it gives only the 32 least significant bits , but works on the mcu 

Таким образом, вы можете видеть, что моя проблема в том, что микроконтроллер будет сгенерирована неопределенной refence к __muldi3 если я попробовать gig = mm1*mm2 есть.

И если я попробую с меньшими типами данных, он сохранит только младшие значащие биты, которые я не хочу. Мне нужны 23 мб бит продукта.

Есть ли у кого-нибудь идеи относительно того, как я могу это сделать?

ответ

1

Извиняется за короткий ответ, я надеюсь, что кто-то еще найдет время, чтобы написать более полное объяснение, но в основном вы делаете то же самое, что и при умножении двух больших чисел на бумаге! Это просто, что вместо работы с базой 10 вы работаете на базе 256. То есть обрабатывайте свои числа в виде байтовых векторов и делайте с каждым байтом то, что вы делаете, с цифрой, когда вы «вручную умножаете».

0

Назад на Intel 8088 (исходный процессор ПК и последний процессор, на который я написал код сборки), когда вы умножаете два 16-разрядных номера (32 бит? Whoow), CPU вернет 2 16-битных номера в двух разных регистрах - один с 16 msb и один с lsb.

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

В противном случае вам придется реализовать умножение самостоятельно.

1

Замечания во внедрении FreeBSD __muldi3() имеют хорошее объяснение требуемой процедуры, см. muldi3.c. Если вы хотите перейти прямо к источнику (всегда хорошая идея!), Согласно комментариям, этот код был основан на алгоритме, описанном в книге Knuth's The Art of Computer Programming vol. 2 (2-е изд.), Раздел 4.3.3, стр. 278. (N.B. ссылка для третьего издания.)