Помогите создать алгоритм быстрого вычисления больших чисел.
Помогите создать алгоритм. есть уравнение
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 мили секунд.
Вопрос, такое в принципе возможно сделать? Если да то как?
Принципиально возможно и за меньшее число времени. Весь вопрос в точности.
Цитата: Pavia
Принципиально возможно. И за меньшее число времени весь вопрос в точности.
ну желательно с точностью до : ( 0.01 )
Реализуешь свой формат с плавующей точкой. Мантису только большую надо сделать и все. Алгоритмы думаю найдешь. У Кнута во втором томе есть раздел "вычисления с плавующей точкой".
Это "уравнение" можно очень сильно упростить...
Цитата: 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 мили секунд.
Вопрос, такое в принципе возможно сделать? Если да то как?
Помогите создать алгоритм. есть уравнение
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 раз дольше операции умножения, заменить деление умножением и будет щастье (с учетом вышеуказанных рекомендаций)
Цитата: oxotnik333
операция деления выполняется в 10 раз дольше операции умножения, заменить деление умножением и будет щастье (с учетом вышеуказанных рекомендаций)
а можнете привести практический пример как это делается? дело в том что я не програмист! и мне бы хотелось увидеть один пример такой манипуляции а дальше я смогу повторить!
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= а+а
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
и т.д.