nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 22:30



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 04:15
Admin
User avatar

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

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


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


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

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


31 May 2009 06:14
Admin
User avatar

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

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


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


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

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


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


31 May 2009 10:58
Retired

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

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


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


01 Jun 2009 06:10
Retired

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


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

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

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


02 Jun 2009 08:20
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22414
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 20 Sep 2012 23:59, edited 1 time in total.



02 Jun 2009 21:49
Profile WWW
Retired

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


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


02 Jun 2009 23:32
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22414
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 21:56
Profile WWW
Admin
User avatar

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

_________________
:dj: https://mastodon.social/@Shaos


17 May 2020 11: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 11 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.