2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Умножение чисел с плавающей запятой с…
Сообщение30.09.2013, 19:23 
…использованием только целочисленной арифметики.
Собственно, сабж. Посоветуйте что почитать.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение30.09.2013, 21:26 
Аватара пользователя
Ну, например, можно почитать здесь:
Д.Кнут "Искусство программирования" том 2 глава 4.3 Арифметика многократной точности.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение30.09.2013, 22:28 
Аватара пользователя
Арифметика плавающей точки в общем-то увеличивает диапазон (масштаб) использования чисел за счёт уменьшения абсолютной точности и сохраняет постоянной относительную точность (если не учитывать трату разрядов на явное указание порядка чисел). Смотреть надо именно арифметику с плавающей точкой, арифметика многократной точности это повышение точности представления чисел за счёт увеличения их разрядности, например если понадобится увеличивать разрядность мантиссы за пределы разрядности целочисленного блока.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение30.09.2013, 22:38 
Аватара пользователя
Chifu
Как я понял, ТС интересуется вопросом моделирования арифметики плавающей точки при помощи целочисленной. На ум приходит школьное умножение в столбик. У Кнута это описано в той главе которую я указал.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение30.09.2013, 23:05 
Аватара пользователя
Арифметика с плавающей точкой это когда числа представлены в виде мантиссы и порядка. Когда мантисса (она обычно значительно длиннее чем порядок) укладывается в слово процессора, то в столбик умножать не надо. И надо учитывать, что на мантиссу отводится фиксированное число разрядов (как в калькуляторе), поэтому если результат умножения не помещается в неё, то младшие значащие разряды не показываются (и изменяется порядок числа).

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение30.09.2013, 23:11 
Аватара пользователя
Chifu
Пожалуй Вы правы, все манипуляции с мантиссой и порядком тоже ведь будут целочисленными.
(глава 4.2 у Кнута)

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение02.10.2013, 19:00 
А в чём проблема то? Если 1.23456789 умножить на 9.87654321, то цифры будут точно те же, что и 123456789 умножить на 987654321. Длинная арифметика давно придумана. Только точку в нужное место вставить, и никакой потери точности.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение03.10.2013, 09:31 
Аватара пользователя
Чья проблема? Если не на бумаге и в уме или программно, то это аппаратная проблема. Тогда и появится точность абсолютная и относительная, и надо будет принять решение какая точность нужна.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение03.10.2013, 15:20 
Я имел ввиду, что арифметика с плавающей запятой ненамного сложнее целочисленной.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение03.10.2013, 19:29 
Alexu007 в сообщении #770064 писал(а):
Длинная арифметика давно придумана.
Придумана то она давно, но работает гораздо медленнее, чем встроеная в CPU/GPU.
А "BNPU" (Big Numbers Processing Unit) пока не выпускаются.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение03.10.2013, 21:41 
Медленно, зато точно: http://cppalgo.blogspot.ru/2010/05/blog-post.html Вообще то конечно реализация зависит от требуемой точности. Но как вариант - почему нет? Запятую прикрутить только - и получится арифметика с плавающей запятой, использующая только целочисленную арифметику.

Изображение

И вообще, имеют ли смысл числа с плавающей запятой, если изменением масштаба (например умножением на единицу со ста нулями) они превращаются в целые? Только для удобства использования человеком?

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение03.10.2013, 22:59 
Ну и нафиг? Начиная с Windows XP, встроенный калькулятор использует arbitrary-precision arithmetics.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение03.10.2013, 23:08 
Joker_vD в сообщении #770422 писал(а):
Начиная с Windows XP, встроенный калькулятор использует arbitrary-precision arithmetics.
Во-первых, не все используют Windows. :-) Во-вторых, этот калькулятор явно не та программа, которую в данном случае стоит приводить в пример.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение04.10.2013, 08:23 
Дело не в калькуляторе, а в алгоритмах длинной арифметики, ссылку на которую я дал. Это же почти готовое решение для автора темы. Там в структуре хранится массив цифр длинного числа, и в отдельной переменной количество цифр. Нужно добавить ещё одну переменную, в которой будет храниться положение точки в числе.

Второй способ - отказаться от плавающей точки вообще, и преобразовывать числа в целые умножением на 10 в степени Х. В данной реализации для этого достаточно изменить переменную с количеством цифр. И в конце вычисления с помощью Х вычислить положение запятой в результате - поделить.

Калькулятор демонстрирует, что всё это работает.

 
 
 
 Re: Умножение чисел с плавающей запятой с…
Сообщение04.10.2013, 21:55 

(Оффтоп)

EtCetera
А теперь попробуйте вычислить $1/3$, умножить результат на $3$ и отнять единицу. Получится ровно ноль, а не $\varepsilon\cdot10^{-39}$

 
 
 [ Сообщений: 21 ]  На страницу 1, 2  След.


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