Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите создать алгоритм быстрого вычисления больших чисел.

33K
25 ноября 2007 года
samson01
3 / / 25.11.2007
доброго времени суток.

Помогите создать алгоритм. есть уравнение

Round((11/ Floor(((10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))*100)-1)/10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))))*(10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))*100))*8

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

Вопрос, такое в принципе возможно сделать? Если да то как?
551
25 ноября 2007 года
Pavia
357 / / 22.04.2004
Принципиально возможно и за меньшее число времени. Весь вопрос в точности.
33K
25 ноября 2007 года
samson01
3 / / 25.11.2007
Цитата: Pavia
Принципиально возможно. И за меньшее число времени весь вопрос в точности.



ну желательно с точностью до : ( 0.01 )

551
25 ноября 2007 года
Pavia
357 / / 22.04.2004
Реализуешь свой формат с плавующей точкой. Мантису только большую надо сделать и все. Алгоритмы думаю найдешь. У Кнута во втором томе есть раздел "вычисления с плавующей точкой".
391
25 ноября 2007 года
Archie
562 / / 03.02.2005
Это "уравнение" можно очень сильно упростить...
11
04 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: samson01
доброго времени суток.

Помогите создать алгоритм. есть уравнение

Round((11/ Floor(((10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))*100)-1)/10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))))*(10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))*100))*8

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

Вопрос, такое в принципе возможно сделать? Если да то как?


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

33K
05 декабря 2007 года
samson01
3 / / 25.11.2007
Цитата: oxotnik333
операция деления выполняется в 10 раз дольше операции умножения, заменить деление умножением и будет щастье (с учетом вышеуказанных рекомендаций)



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

11
05 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
было:
Round((11/ Floor(((10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))*100)-1)/10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))))*(10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))*100))*8
с заменой оп-ции деления (умножаем на обратную величину, т.е. если делилось на 2, то надо умножить на 0.5, если на 10, то умножить на 0.1):

Round((11/ Floor(((10^Floor(Lg((((2/(1/12^258048000))+2)/2)/10))*100)-1)/10^Floor(Lg((((2/(1/12^258048000))+2)*0.5)*0.10))))*(10^Floor(Lg((((2/(1/12^258048000))+2)*0.5)*0.10))*100))*8

далее, если в цикле это вычисляется, то констаны типа 1/12^258048000 желательно просчитать заранее, а в теле цикла вставлять уже значение (а ежели на него делится, то обратное ему значение)

ЗЫ: по поводу времени операции деления: имелось ввиду машинное время, т.е. алгоритм машинного деления выполняется за 20 циклов, умножения за 2, а сложения за один, поэтому формулу типа n = 2*а лучше переписать как n= а+а
353
05 декабря 2007 года
Nixus
840 / / 04.01.2007
1. ( 2 / (1/12^258048000) ) = 2*12^258048000


2. Lg((( (2/(1/12^258048000)) +2)/2)/10) = Lg((( 2*12^258048000 + 2 )/2)/10) = Lg( ( 12^258048000 + 1 )/10 ) = Lg(12^258048000 + 1) - 1

и т.д.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог