Дробная арифметика для микроконтроллера
От: _hum_ Беларусь  
Дата: 17.01.13 13:48
Оценка:
Столкнулся со следующей проблемой. Пишу язык высокого уровня для программирования микроконтроллера. Хотелось бы иметь возможность вычисления арифметических и логических выражений. Но в микроконтроллере предусмотрена работа только с целыми числами (даже аппаратного деления нацело нет). Так вот мне пришла в голову следующая идея. Для практических нужд вполне хватит рациональных чисел, а они, как известно, отождествляются с парой целых (числитель, знаменатель). Потому можно в контроллере все числа, с которыми идет работа, представлять парами целых и реализовать арифметику следующим образом:

пусть u,u' - рациональные числа:  

u  <-> (m, n)
u' <-> (m',n')

(предполагается, что в записи рационального числа парой (числитель, знаменатель) знаменатель всегда неотрицателен).


Тогда:

u + u' <-> (mn' + m'n, nn')
u - u' <-> (mn' - m'n, nn')
uu'    <-> (mm', nn')
u/u'   <-> (mn', m'n)
 
u < u'  <-> mn' < m'n


и, что интересно, если ввести сопоставление:

+∞    <-> всякая пара вида (□, 0),  где □ - некоторое натуральнео число > 0
-∞    <-> всякая пара вида (-□, 0),
0     <-> всякая пара вида (0, □),
Undef <-> (0,0),


то получим вполне адекватную расширенную арифметику:

+∞ + u <-> (□,0) + (m,n) = (□,0) <->  +∞
+∞ u   <-> (□,0)(m,n)    = (□,0) <->  +∞
+∞/u   <-> (□,0)/(m,n)   = (□,0) <->  +∞
u/+∞   <-> (m,n)/(□,0)   = (0,□) <-> 0  

+∞ + (-∞) <-> (□,0) + (-□,0) = (0,0) <-> Undef
+∞ 0      <-> (□,0) (0,1)   = (0,0)  <-> Undef



Что вы думаете на этот счет. Какие здесь подводные камни?
П.С. Умножение/сложение в контроллере быстрое (~одного такта).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.