информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetЗа кого нас держат?Портрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Последний второй Python 
 Microsoft предупредила о двух незакрытых... 
 Перевод Firefox на DNS over HTTPS 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
На здоровье! Визуально проверить это ниасилил, да и не к... 26.06.07 17:02  Число просмотров: 2273
Автор: 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 в соответствующей степени, Это число легко преобразуется в целое и оно будет определять необходимые значащие цифры, а значение экспоненты, легко получается из десятичного логарифма исходного числа, приведением его к целому значению.
<programming> Поиск 








Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2020 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach