поддержка троично-десятичной арифметики

Уравновешенная троичная система счисления - форум переехал с http://ternary.info

Moderator: haqreu

sva

Re: поддержка троично-десятичной арифметики

Post by sva »

ессно что кругление

не понимаю что вас смущает
round(0.6) = 1
другое дело что в данном случае 5/10 дает "0" а не "1" как должно бы
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: поддержка троично-десятичной арифметики

Post by Shaos »

sva wrote: ессно что кругление

не понимаю что вас смущает
roubd(0.6) = 1
другое дело что в данном случае 5/10 дает "0" а не "1" как должно бы
хм - да, по идее тут тоже округление применимо, НО - это деление получается уж ОЧЕНЬ приближённое...
sva

Re: поддержка троично-десятичной арифметики

Post by sva »

за исключением эффекта округления .5 все остальное целочисленное деление на 10 выполняется верно (во всяком случае я не нашел ошибок)

в любом случае это лишь один из методов
если будет найден лучше то это будет замечательно
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: поддержка троично-десятичной арифметики

Post by Shaos »

sva wrote: за исключением эффекта округления .5 все остальное целочисленное деление на 10 выполняется верно (во всяком случае я не нашел ошибок)

в любом случае это лишь один из методов
если будет найден лучше то это будет замечательно
Ок, даже если предположить, что round(0.5)=0, то всё равно оно дошло только до 86 (86/10=8?)
sva

Re: поддержка троично-десятичной арифметики

Post by sva »

согласен, необходима коррекция

когда выпадающие 2 разряда последнего сдвига равны "++" (такое происходит только при делимом = ##5 и =##6) необходимо добавлять "+" к результату
это кстати решит и вопрос с 0.5


етсь предложения как сделать это минимальным набором действий?
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Re: поддержка троично-десятичной арифметики

Post by Mac Buster »

Это всё сильно зависит от того как вы представляете себе выполнение. Скажем, в случае программирования на ассемблере это выливается в дополнительные 5 команд:

- копирование младшего слова результата в промежуточный регистр;
- маскирование двух младших разрядов;
- проверка сравнением;
- пропуск следующей команды, если результат сравнение не равен "++";
- добавить "+" к результату сдвига.
sva

Re: поддержка троично-десятичной арифметики

Post by sva »

в общем-то это отдельный вопрос.
подход к тому что должно быть реализовано програмно, а что аппаратно
лично мне например ужасно не нравится идея аппаратной реализации деления (хотя это еще можно пережить :-)) и особенно ФП.
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Re: поддержка троично-десятичной арифметики

Post by Mac Buster »

Я так понял ваш вопрос что интересует программная реализация. На данный момент есть только одна возможность реализовать и проверить алгоритм - использовать эмулятор "Тунгуска", программы для которого пишутся пока на его ассемблере. Хотя, можно попробовать использовать 3C, входящий в состав последней версии.
sva

Re: поддержка троично-десятичной арифметики

Post by sva »

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

вполне логично их сделать программынми, НО ...
... но для быстрйо программной реализации очень помогла бы аппаратная поддержка тех или иных операций (вроде организции циклов для DSP)
а это уже зависит от используемых алгоритмов

поэтому чем больше лгоритмов мы рассмотрим и из разных областей тем больше у нас будет информации об используемости и необходимости аппаратной поддержки тех или иных операций
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: поддержка троично-десятичной арифметики

Post by Shaos »

Вот вариант, который покрывает весь положительный диапазон трайта (6 тритов - от 0 до +364):

Code: Select all

#!/usr/local/bin/hopeless -f

dec round : num -> num;
--- round(x) <= if x-f < 0.5 then f
                else f+1 where f==floor(x);

dec correction : num -> num;
--- correction(x) <= if x < 85 then 1
                else if x < 165 then 2
                else if x < 245 then 3
                else if x < 325 then 4
                else 5;

dec tri10 : num -> num;
--- tri10(x) <= let x1==x+correction(x) in
                round((x1-round(x1/9))/9);

dec try : num # list(num # num) -> list(num # num);
--- try(x,l) <= if round(x/10) = tri10(x) then try(x+1,ll) 
                else ll where ll==(x,tri10(x))::l;

try(0,nil);
Программа запнулась на 405, но на самом деле коррекцию можно продолжать и дальше либо отыскать простую формулу этой коррекции:
>> [(405, 40), (404, 40), (403, 40), (402, 40), (401, 40), (400, 40), (399, 40), (398, 40), (397, 40), (396, 40), (395, 40), (394, 39), (393, 39), (392, 39), (391, 39), (390, 39), (389, 39), (388, 39), (387, 39), (386, 39), (385, 39), (384, 38), (383, 38), (382, 38), (381, 38), (380, 38), (379, 38), (378, 38), (377, 38), (376, 38), (375, 38), (374, 37), (373, 37), (372, 37), (371, 37), (370, 37), (369, 37), (368, 37), (367, 37), (366, 37), (365, 37), (364, 36), (363, 36), (362, 36), (361, 36), (360, 36), (359, 36), (358, 36), (357, 36), (356, 36), (355, 36), (354, 35), (353, 35), (352, 35), (351, 35), (350, 35), (349, 35), (348, 35), (347, 35), (346, 35), (345, 35), (344, 34), (343, 34), (342, 34), (341, 34), (340, 34), (339, 34), (338, 34), (337, 34), (336, 34), (335, 34), (334, 33), (333, 33), (332, 33), (331, 33), (330, 33), (329, 33), (328, 33), (327, 33), (326, 33), (325, 33), (324, 32), (323, 32), (322, 32), (321, 32), (320, 32), (319, 32), (318, 32), (317, 32), (316, 32), (315, 32), (314, 31), (313, 31), (312, 31), (311, 31), (310, 31), (309, 31), (308, 31), (307, 31), (306, 31), (305, 31), (304, 30), (303, 30), (302, 30), (301, 30), (300, 30), (299, 30), (298, 30), (297, 30), (296, 30), (295, 30), (294, 29), (293, 29), (292, 29), (291, 29), (290, 29), (289, 29), (288, 29), (287, 29), (286, 29), (285, 29), (284, 28), (283, 28), (282, 28), (281, 28), (280, 28), (279, 28), (278, 28), (277, 28), (276, 28), (275, 28), (274, 27), (273, 27), (272, 27), (271, 27), (270, 27), (269, 27), (268, 27), (267, 27), (266, 27), (265, 27), (264, 26), (263, 26), (262, 26), (261, 26), (260, 26), (259, 26), (258, 26), (257, 26), (256, 26), (255, 26), (254, 25), (253, 25), (252, 25), (251, 25), (250, 25), (249, 25), (248, 25), (247, 25), (246, 25), (245, 25), (244, 24), (243, 24), (242, 24), (241, 24), (240, 24), (239, 24), (238, 24), (237, 24), (236, 24), (235, 24), (234, 23), (233, 23), (232, 23), (231, 23), (230, 23), (229, 23), (228, 23), (227, 23), (226, 23), (225, 23), (224, 22), (223, 22), (222, 22), (221, 22), (220, 22), (219, 22), (218, 22), (217, 22), (216, 22), (215, 22), (214, 21), (213, 21), (212, 21), (211, 21), (210, 21), (209, 21), (208, 21), (207, 21), (206, 21), (205, 21), (204, 20), (203, 20), (202, 20), (201, 20), (200, 20), (199, 20), (198, 20), (197, 20), (196, 20), (195, 20), (194, 19), (193, 19), (192, 19), (191, 19), (190, 19), (189, 19), (188, 19), (187, 19), (186, 19), (185, 19), (184, 18), (183, 18), (182, 18), (181, 18), (180, 18), (179, 18), (178, 18), (177, 18), (176, 18), (175, 18), (174, 17), (173, 17), (172, 17), (171, 17), (170, 17), (169, 17), (168, 17), (167, 17), (166, 17), (165, 17), (164, 16), (163, 16), (162, 16), (161, 16), (160, 16), (159, 16), (158, 16), (157, 16), (156, 16), (155, 16), (154, 15), (153, 15), (152, 15), (151, 15), (150, 15), (149, 15), (148, 15), (147, 15), (146, 15), (145, 15), (144, 14), (143, 14), (142, 14), (141, 14), (140, 14), (139, 14), (138, 14), (137, 14), (136, 14), (135, 14), (134, 13), (133, 13), (132, 13), (131, 13), (130, 13), (129, 13), (128, 13), (127, 13), (126, 13), (125, 13), (124, 12), (123, 12), (122, 12), (121, 12), (120, 12), (119, 12), (118, 12), (117, 12), (116, 12), (115, 12), (114, 11), (113, 11), (112, 11), (111, 11), (110, 11), (109, 11), (108, 11), (107, 11), (106, 11), (105, 11), (104, 10), (103, 10), (102, 10), (101, 10), (100, 10), (99, 10), (98, 10), (97, 10), (96, 10), (95, 10), (94, 9), (93, 9), (92, 9), (91, 9), (90, 9), (89, 9), (88, 9), (87, 9), (86, 9), (85, 9), (84, 8), (83, 8), (82, 8), (81, 8), (80, 8), (79, 8), (78, 8), (77, 8), (76, 8), (75, 8), (74, 7), (73, 7), (72, 7), (71, 7), (70, 7), (69, 7), (68, 7), (67, 7), (66, 7), (65, 7), (64, 6), (63, 6), (62, 6), (61, 6), (60, 6), (59, 6), (58, 6), (57, 6), (56, 6), (55, 6), (54, 5), (53, 5), (52, 5), (51, 5), (50, 5), (49, 5), (48, 5), (47, 5), (46, 5), (45, 5), (44, 4), (43, 4), (42, 4), (41, 4), (40, 4), (39, 4), (38, 4), (37, 4), (36, 4), (35, 4), (34, 3), (33, 3), (32, 3), (31, 3), (30, 3), (29, 3), (28, 3), (27, 3), (26, 3), (25, 3), (24, 2), (23, 2), (22, 2), (21, 2), (20, 2), (19, 2), (18, 2), (17, 2), (16, 2), (15, 2), (14, 1), (13, 1), (12, 1), (11, 1), (10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (5, 1), (4, 0), (3, 0), (2, 0), (1, 0), (0, 0)] : list (num # num)
По поводу тунгуски - команда деления там и так есть (причём 12-тритовая), а вот в тринити деления нету и там этот алгоритм был бы кстати ;)
Last edited by Shaos on 20 Sep 2012 23:59, edited 1 time in total.
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Re: поддержка троично-десятичной арифметики

Post by Mac Buster »

По поводу тунгуски - команда деления там и так есть (причём 12-тритовая), а вот в тринити деления нету и там этот алгоритм был бы кстати ;)
Да, и в самом деле, я забыл написать про тринити :(
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: поддержка троично-десятичной арифметики

Post by Shaos »

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

x/10 = x/9 - x/81 + x/729 - x/6561 ...

Для трайта можно ограничится тремя слагаемыми, перестроив выражение так:

x/10 = (x-(x-(x/9)/9))/9

Code: Select all

#!/usr/local/bin/hopeless -f

dec round : num -> num;
--- round(x) <= if x-f < 0.5 then f
                else f+1 where f==floor(x);

dec tri10b : num -> num;
--- tri10b(x) <= round((x-round((x-round(x/9))/9))/9);

dec try : num # list(num # num) -> list(num # num);
--- try(x,l) <= let fx==tri10b(x) in 
                if round(x/10) = fx then try(x+1,ll) 
                else ll where ll==(x,fx)::l;
try(0,nil);
Формула запнулась только на 734!
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: поддержка троично-десятичной арифметики

Post by Shaos »

Поднимаю тему, чтобы не потерялась...
Я тут за главного - если что шлите мыло на me собака shaos точка net