поддержка троично-десятичной арифметики
Moderator: haqreu
Re: поддержка троично-десятичной арифметики
ессно что кругление
не понимаю что вас смущает
round(0.6) = 1
другое дело что в данном случае 5/10 дает "0" а не "1" как должно бы
не понимаю что вас смущает
round(0.6) = 1
другое дело что в данном случае 5/10 дает "0" а не "1" как должно бы
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: поддержка троично-десятичной арифметики
хм - да, по идее тут тоже округление применимо, НО - это деление получается уж ОЧЕНЬ приближённое...sva wrote: ессно что кругление
не понимаю что вас смущает
roubd(0.6) = 1
другое дело что в данном случае 5/10 дает "0" а не "1" как должно бы
Re: поддержка троично-десятичной арифметики
за исключением эффекта округления .5 все остальное целочисленное деление на 10 выполняется верно (во всяком случае я не нашел ошибок)
в любом случае это лишь один из методов
если будет найден лучше то это будет замечательно
в любом случае это лишь один из методов
если будет найден лучше то это будет замечательно
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: поддержка троично-десятичной арифметики
Ок, даже если предположить, что round(0.5)=0, то всё равно оно дошло только до 86 (86/10=8?)sva wrote: за исключением эффекта округления .5 все остальное целочисленное деление на 10 выполняется верно (во всяком случае я не нашел ошибок)
в любом случае это лишь один из методов
если будет найден лучше то это будет замечательно
Re: поддержка троично-десятичной арифметики
согласен, необходима коррекция
когда выпадающие 2 разряда последнего сдвига равны "++" (такое происходит только при делимом = ##5 и =##6) необходимо добавлять "+" к результату
это кстати решит и вопрос с 0.5
етсь предложения как сделать это минимальным набором действий?
когда выпадающие 2 разряда последнего сдвига равны "++" (такое происходит только при делимом = ##5 и =##6) необходимо добавлять "+" к результату
это кстати решит и вопрос с 0.5
етсь предложения как сделать это минимальным набором действий?
-
- Retired
- Posts: 1474
- Joined: 03 Aug 2003 22:37
- Location: Moscow
Re: поддержка троично-десятичной арифметики
Это всё сильно зависит от того как вы представляете себе выполнение. Скажем, в случае программирования на ассемблере это выливается в дополнительные 5 команд:
- копирование младшего слова результата в промежуточный регистр;
- маскирование двух младших разрядов;
- проверка сравнением;
- пропуск следующей команды, если результат сравнение не равен "++";
- добавить "+" к результату сдвига.
- копирование младшего слова результата в промежуточный регистр;
- маскирование двух младших разрядов;
- проверка сравнением;
- пропуск следующей команды, если результат сравнение не равен "++";
- добавить "+" к результату сдвига.
Re: поддержка троично-десятичной арифметики
в общем-то это отдельный вопрос.
подход к тому что должно быть реализовано програмно, а что аппаратно
лично мне например ужасно не нравится идея аппаратной реализации деления (хотя это еще можно пережить
) и особенно ФП.
подход к тому что должно быть реализовано програмно, а что аппаратно
лично мне например ужасно не нравится идея аппаратной реализации деления (хотя это еще можно пережить

-
- Retired
- Posts: 1474
- Joined: 03 Aug 2003 22:37
- Location: Moscow
Re: поддержка троично-десятичной арифметики
Я так понял ваш вопрос что интересует программная реализация. На данный момент есть только одна возможность реализовать и проверить алгоритм - использовать эмулятор "Тунгуска", программы для которого пишутся пока на его ассемблере. Хотя, можно попробовать использовать 3C, входящий в состав последней версии.
Re: поддержка троично-десятичной арифметики
и да и нет
дело в том что аппаратная реализация конечно вариант идеальный, НО ...
... но как правило некоторые операции требуют больших ресурсов либо времени (что к примеру снижет частоту работы устройства) и в то же время не так часто используются
вполне логично их сделать программынми, НО ...
... но для быстрйо программной реализации очень помогла бы аппаратная поддержка тех или иных операций (вроде организции циклов для DSP)
а это уже зависит от используемых алгоритмов
поэтому чем больше лгоритмов мы рассмотрим и из разных областей тем больше у нас будет информации об используемости и необходимости аппаратной поддержки тех или иных операций
дело в том что аппаратная реализация конечно вариант идеальный, НО ...
... но как правило некоторые операции требуют больших ресурсов либо времени (что к примеру снижет частоту работы устройства) и в то же время не так часто используются
вполне логично их сделать программынми, НО ...
... но для быстрйо программной реализации очень помогла бы аппаратная поддержка тех или иных операций (вроде организции циклов для DSP)
а это уже зависит от используемых алгоритмов
поэтому чем больше лгоритмов мы рассмотрим и из разных областей тем больше у нас будет информации об используемости и необходимости аппаратной поддержки тех или иных операций
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: поддержка троично-десятичной арифметики
Вот вариант, который покрывает весь положительный диапазон трайта (6 тритов - от 0 до +364):
Программа запнулась на 405, но на самом деле коррекцию можно продолжать и дальше либо отыскать простую формулу этой коррекции:
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);
По поводу тунгуски - команда деления там и так есть (причём 12-тритовая), а вот в тринити деления нету и там этот алгоритм был бы кстати ;)>> [(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)
Last edited by Shaos on 20 Sep 2012 23:59, edited 1 time in total.
-
- Retired
- Posts: 1474
- Joined: 03 Aug 2003 22:37
- Location: Moscow
Re: поддержка троично-десятичной арифметики
Да, и в самом деле, я забыл написать про тринитиПо поводу тунгуски - команда деления там и так есть (причём 12-тритовая), а вот в тринити деления нету и там этот алгоритм был бы кстати

-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: поддержка троично-десятичной арифметики
Наш шведский товарищ привёл более точную формулу:
x/10 = x/9 - x/81 + x/729 - x/6561 ...
Для трайта можно ограничится тремя слагаемыми, перестроив выражение так:
x/10 = (x-(x-(x/9)/9))/9
Формула запнулась только на 734!
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);
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: поддержка троично-десятичной арифметики
Поднимаю тему, чтобы не потерялась...
Я тут за главного - если что шлите мыло на me собака shaos точка net