nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 23 Nov 2020 21:46



Reply to topic  [ 28 posts ]  Go to page Previous  1, 2
поддержка троично-десятичной арифметики 
Author Message
Reply with quote
ессно что кругление

не понимаю что вас смущает
round(0.6) = 1
другое дело что в данном случае 5/10 дает "0" а не "1" как должно бы


31 May 2009 05:15
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18964
Location: Silicon Valley
Reply with quote
sva wrote:
ессно что кругление

не понимаю что вас смущает
roubd(0.6) = 1
другое дело что в данном случае 5/10 дает "0" а не "1" как должно бы


хм - да, по идее тут тоже округление применимо, НО - это деление получается уж ОЧЕНЬ приближённое...


31 May 2009 06:51
Profile WWW
Reply with quote
за исключением эффекта округления .5 все остальное целочисленное деление на 10 выполняется верно (во всяком случае я не нашел ошибок)

в любом случае это лишь один из методов
если будет найден лучше то это будет замечательно


31 May 2009 07:14
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18964
Location: Silicon Valley
Reply with quote
sva wrote:
за исключением эффекта округления .5 все остальное целочисленное деление на 10 выполняется верно (во всяком случае я не нашел ошибок)

в любом случае это лишь один из методов
если будет найден лучше то это будет замечательно


Ок, даже если предположить, что round(0.5)=0, то всё равно оно дошло только до 86 (86/10=8?)


31 May 2009 09:22
Profile WWW
Reply with quote
согласен, необходима коррекция

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


етсь предложения как сделать это минимальным набором действий?


31 May 2009 11:58
Retired

Joined: 03 Aug 2003 23:37
Posts: 1479
Location: Moscow
Reply with quote
Это всё сильно зависит от того как вы представляете себе выполнение. Скажем, в случае программирования на ассемблере это выливается в дополнительные 5 команд:

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


01 Jun 2009 06:10
Profile
Reply with quote
в общем-то это отдельный вопрос.
подход к тому что должно быть реализовано програмно, а что аппаратно
лично мне например ужасно не нравится идея аппаратной реализации деления (хотя это еще можно пережить :-)) и особенно ФП.


01 Jun 2009 07:10
Retired

Joined: 03 Aug 2003 23:37
Posts: 1479
Location: Moscow
Reply with quote
Я так понял ваш вопрос что интересует программная реализация. На данный момент есть только одна возможность реализовать и проверить алгоритм - использовать эмулятор "Тунгуска", программы для которого пишутся пока на его ассемблере. Хотя, можно попробовать использовать 3C, входящий в состав последней версии.


02 Jun 2009 05:38
Profile
Reply with quote
и да и нет
дело в том что аппаратная реализация конечно вариант идеальный, НО ...
... но как правило некоторые операции требуют больших ресурсов либо времени (что к примеру снижет частоту работы устройства) и в то же время не так часто используются

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

поэтому чем больше лгоритмов мы рассмотрим и из разных областей тем больше у нас будет информации об используемости и необходимости аппаратной поддержки тех или иных операций


02 Jun 2009 09:20
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18964
Location: Silicon Valley
Reply with quote
Вот вариант, который покрывает весь положительный диапазон трайта (6 тритов - от 0 до +364):

Code:
#!/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, но на самом деле коррекцию можно продолжать и дальше либо отыскать простую формулу этой коррекции:

Quote:
>> [(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 21 Sep 2012 00:59, edited 1 time in total.



02 Jun 2009 22:49
Profile WWW
Retired

Joined: 03 Aug 2003 23:37
Posts: 1479
Location: Moscow
Reply with quote
Quote:
По поводу тунгуски - команда деления там и так есть (причём 12-тритовая), а вот в тринити деления нету и там этот алгоритм был бы кстати ;)


Да, и в самом деле, я забыл написать про тринити :(


03 Jun 2009 00:32
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18964
Location: Silicon Valley
Reply with quote
Наш шведский товарищ привёл более точную формулу:

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

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

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

Code:
#!/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!


16 Jun 2009 22:56
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18964
Location: Silicon Valley
Reply with quote
Поднимаю тему, чтобы не потерялась...

_________________
:eugeek: https://twitter.com/Shaos1973


17 May 2020 12:47
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 28 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.