2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 операционное число вне систем счисления...
Сообщение17.12.2011, 00:03 
при операциях деления могут возникать бесконечные дроби... - теряем точность ...

если потеря точности регистрируется, переводим вычисление в систему счисления с другим основанием, таким, что дробь перестает быть бесконечной ...

так, переходя из одной системы счисления в другую закончим цепь вычислений без потерь при делении ...

==========

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

как мне оперировать числом не отдавая его процессору в чисто символьном виде

по-моему это в принципе невозможно ...

спасибо за помощь

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

-- Сб дек 17, 2011 00:05:46 --

это я затупил - двоичная система при сложениях и вычитаниях погрешности не внесет...

вопрос снят...

другой вопрос - этой проблемой занимались?

 
 
 
 Re: операционное число вне систем счисления...
Сообщение17.12.2011, 01:19 
погрешности не внесет если использовать целочисленный тип int и только сложение и вычитание ...

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

и как это учитывать?

 
 
 
 Re: операционное число вне систем счисления...
Сообщение17.12.2011, 09:51 
function r=system_to_system(a, new_s)
% перевод числа из одной системы счисления в другую
% формат числа в массиве:
% 1. int32(x) - система счисления от 2 до 2^32-1
% 2. zeros(x,'int32') - мантиса
% 3. int32(x) - Недесятичная экспонента. Здесь - положение "точки" направо от первого символа. 0 - если точка слева от первого симовола мантисы
% 4. int32(x) - флаг предыдущей операции
% 0 - все хорошо
% 10 - неверная система счисления
% 1 - переполнение влево
% 2 - переполнение вправо
% 3 - входящее число = 0


% ПРОВЕРКА ВХОДЯЩИХ ПАРАМЕТРОВ
if a.system == 0
a.flags=10; r=b; % неправильная система счисления
return
end;

if sum(a.mantissa)==0
a.flags=3; a.system=new_s; r=a; % входящее число 0 + новая система счисления
return
end

b=uni_sys; % создадим число для новой системы счисления
b.system=new_s; % присвоение новой системы счисления
b.exponent=a.exponent; % присвоение мантисы

ac=int64(0); % аккумулятор перекрутки - обнуление
m_l= length(a.mantissa) - 1; % длина перебора мантисы
e_l= a.exponent; % степень числа разряда
i=1; % индекс для перебора мантисы


% ПОДЫМАЕМ ПЕРЕВОДИМОЕ ЧИСЛО В ОПЕРАБЕЛЬНОЕ ПРЕДСТАВЛЕНИЕ

while m_l > -1 % пока есть витки
ac= ac + a.mantissa(i)*(a.system^(e_l-1)); % отмотаем виток прежней системы исчисления, прибавим к аккумулятору
m_l = m_l-1; i=i+1;
e_l = e_l - 1; if e_l == 0; e_l=-1; end
end

% ПЕРЕВОДИМ ЧИСЛО В НОВУЮ СИСТЕМУ СЧИСЛЕНИЯ
while ac > b.system^(b.exponent - 1)
b.exponent=b.exponent+1; % если превысит то на один меньше, потому что "откручиванием" отниманием
end

while ac < b.system^(b.exponent - 1)
b.exponent=b.exponent-1; % если превысит то на один меньше, потому что "откручиванием" отниманием
end



i=1; e = b.exponent;
while ac > 0 % пока есть что наматывать наматываем



n = b.system ;
while ac < (n) * b.system^(e-1)
n = n - 1; % уточнение значения разряда в новой системе счисления
end




m = n * b.system^(e-1); % минус. промежуточная переменная для ускорения.
ac = ac - m; % отнимаем один виток в новой системе счисления
b.mantissa(i)=n; i=i+1; %
e = e - 1;


end

r=b;

return






classdef uni_sys
properties
system = int32(0);
mantissa = zeros(1,'int32');
exponent = int32(0);
flags = int32(0);
end
end

 
 
 
 Re: операционное число вне систем счисления...
Сообщение18.12.2011, 10:30 
Аватара пользователя
Очень скоро у Вас пойдут в качестве основания системы счисления огромные числа. Более практичный подход, если для Вас принципиально важно деление и умножение без погрешностей, представлять числа в виде простых дробей, парой "числитель/знаменатель". Впрочем, и тут будет иметь место возрастание чисел.
Описание алгоритмов можно найти, в том числе, у Кнута, "Искусство программирования для ЭВМ", т.2, гл. 4 "Получисленные алгоритмы".

 
 
 
 Re: операционное число вне систем счисления...
Сообщение18.12.2011, 10:41 
выше програмку я написал для целочисленных, а не для дробей

1/3 в любой системе счисления с четным основанием непередаваема...

есть системы счисления 1. с нечетным основанием, а есть 2 . с четным

и это все...

решения нет - потери всегда будут...

-- Вс дек 18, 2011 10:41:09 --

выше програмку я написал для целочисленных, а не для дробей

1/3 в любой системе счисления с четным основанием непередаваема...

есть системы счисления 1. с нечетным основанием, а есть 2 . с четным

и это все...

решения нет - потери всегда будут...

 
 
 
 Re: операционное число вне систем счисления...
Сообщение19.12.2011, 20:19 
Аватара пользователя
Число 1/5 может ли быть представленным в системе счисления с нечётным основанием 3? Или 1/10 в двоичной системе?
Один мой знакомый считал (зачем, не знаю) определитель в целых числах, цитирую его:
Цитата:
Определитель я решил считать примерно как в школе учили, приводя матрицу к верхнетреугольной, но, чтобы ограничиться целочисленными вычислениями и не лезть во всякие double'ы, занулять элементы матрицы решил не вычисляя нецелый коэффициент, а, по алгоритму Евклида попытаться занулить либо текущий диагональный элемент, либо поддиагональный, уж как получится, если занулится диагональный, то переставить две строчки.

Переполнение в 32-битных целых получалось для матриц 8х8, в 64-битной для 11х11.

 
 
 
 Re: операционное число вне систем счисления...
Сообщение26.12.2011, 15:58 
Аватара пользователя
В принципе вам ничто не мешает построить алгебру для оперирования бесконечными дробями без потерь точности, единственная сложность возникнет на этапе построения для такой алгебры правильного процессора.

 
 
 
 Re: операционное число вне систем счисления...
Сообщение26.12.2011, 16:29 
Мне представляется логичнее использовать представление рациональных чисел (и квадратичных иррациональностей в т.ч.) в конечных (или периодических) цепных дробях, краткую информацию см., например, здесь.

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group