Столкнулся со следующей проблемой. Пишу язык высокого уровня для программирования микроконтроллера. Хотелось бы иметь возможность вычисления арифметических и логических выражений. Но в микроконтроллере предусмотрена работа только с целыми числами (даже аппаратного деления нацело нет). Так вот мне пришла в голову следующая идея. Для практических нужд вполне хватит рациональных чисел, а они, как известно, отождествляются с парой целых (числитель, знаменатель). Потому можно в контроллере все числа, с которыми идет работа, представлять парами целых и реализовать арифметику следующим образом:
пусть 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
Что вы думаете на этот счет. Какие здесь подводные камни?
П.С. Умножение/сложение в контроллере быстрое (~одного такта).