2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 операционное число вне систем счисления...
Сообщение17.12.2011, 00:03 
Заблокирован


14/12/09

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

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

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

==========

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

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

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

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

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

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

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

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

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

 Профиль  
                  
 
 Re: операционное число вне систем счисления...
Сообщение17.12.2011, 01:19 
Заблокирован


14/12/09

68
погрешности не внесет если использовать целочисленный тип int и только сложение и вычитание ...

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

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

 Профиль  
                  
 
 Re: операционное число вне систем счисления...
Сообщение17.12.2011, 09:51 
Заблокирован


14/12/09

68
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 
Заслуженный участник
Аватара пользователя


11/03/08
9908
Москва
Очень скоро у Вас пойдут в качестве основания системы счисления огромные числа. Более практичный подход, если для Вас принципиально важно деление и умножение без погрешностей, представлять числа в виде простых дробей, парой "числитель/знаменатель". Впрочем, и тут будет иметь место возрастание чисел.
Описание алгоритмов можно найти, в том числе, у Кнута, "Искусство программирования для ЭВМ", т.2, гл. 4 "Получисленные алгоритмы".

 Профиль  
                  
 
 Re: операционное число вне систем счисления...
Сообщение18.12.2011, 10:41 
Заблокирован


14/12/09

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

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

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

и это все...

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

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

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

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

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

и это все...

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

 Профиль  
                  
 
 Re: операционное число вне систем счисления...
Сообщение19.12.2011, 20:19 
Заслуженный участник
Аватара пользователя


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

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

 Профиль  
                  
 
 Re: операционное число вне систем счисления...
Сообщение26.12.2011, 15:58 
Аватара пользователя


14/05/05
224
Баку
В принципе вам ничто не мешает построить алгебру для оперирования бесконечными дробями без потерь точности, единственная сложность возникнет на этапе построения для такой алгебры правильного процессора.

 Профиль  
                  
 
 Re: операционное число вне систем счисления...
Сообщение26.12.2011, 16:29 


21/03/06
1545
Москва
Мне представляется логичнее использовать представление рациональных чисел (и квадратичных иррациональностей в т.ч.) в конечных (или периодических) цепных дробях, краткую информацию см., например, здесь.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group