Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
На здоровье! Визуально проверить это ниасилил, да и не к... 26.06.07 17:02 Число просмотров: 2780
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 26.06.07 17:11 Количество правок: 7
|
> Возможно, через некоторое время оптимизированный вариант > выложу. Если кто, что ещё посоветует по-поводу буду рад.
На здоровье! Визуально проверить это ниасилил, да и не к чему. Сейчас поясню...
Во первых, что я влез. Я просто вспомнил про табличную оптимизацию. Если нужно 600 значений по 8 байт и прога от этого будет быстрее работать хотя бы процентов на 10, то нужно плюнуть на эти лишних пять килобайт и завести массив. Скорость будет однозначно выше, так как операции с возведением в степень или даже делением/умножением на сопроцессоре медленнее, чем обращение/адресация к элементу массива.
Причем чем больше массив, тем быстрее вычисления. Тригонометрия будет считаться быстрее если от таблицы с шагом 0.1 радиан перейти к таблице с шагом в 0.01 радиан раз в десять, а количество элементов таблицы увеличится с 16 до 160.
Еще со времен четвертого фортрана было несколько форматов вывода чисел с плавающей запятой. Обычная, экспоненциальная и компактная, то есть либо обычная, либо экспоненциальная в зависимости от самого числа (для очень больших и очень маленьких чисел экспоненциальная, а так - обычная). Обычная - удобочитаемая. Экспоненциальная - универсальная. Какая вам была нужна я до сих пор не понял, от этого тоже много чего зависит.
Так вот поясню: В зависимости от того что из условий более важное, алгоритм можно еще убыстрить. А именно, если требуется сделать все через жопу сопроцессор, то отлаживайте свой вариант, а если важна скорость преобразование и форма вывода только экспоненциальная, то предложу такое решение. Дла него опять же надо хорошо вспомнить школьный курс логарифмов.
Короче:
1) Вычисляем десятичный логарифм.
2) Находим разность между ним и 20.
3) Умножаем исходное число на 10 в степени разности (полученой во втором пункте).
4) Преобразуем это в целое длинное число, а затем его уже в цифровую форму через обычные несопроцессорные, а целочисленные операции. Это и будет то, что должно быть после точки в мантиссе.
5) Как вычислить экспоненту, сами догадаетесь. Преобразовать ее в цифровую форму тоже легко.
Всего в этом алгоритме будет пяток вычислительных медленный инструкций с плавающей запятой, несколько инструкций загрузки/выгрузки и преобразований к целым. Поразрядное получение цифр дробной части мантиссы будет не медленнее, чем несколько вычислений на сопроцессоре.
Идея этого всего в том, чтобы преобразовать исходное число в число в диапазоне 10^19<=X<10^20, умножив его на 10 в соответствующей степени, Это число легко преобразуется в целое и оно будет определять необходимые значащие цифры, а значение экспоненты, легко получается из десятичного логарифма исходного числа, приведением его к целому значению.
|
|
|