есть цикл
For i=1 to N
и формула
GAT = (S0 ∙ … ∙ SN)^1/(N + 1)
надо её посчитать
если сначала отдельно произведение брать,а потом за циклом степень,выдает переполнение
как степень разложить???
есть цикл
For i=1 to N
и формула
GAT = (S0 ∙ … ∙ SN)^1/(N + 1)
надо её посчитать
если сначала отдельно произведение брать,а потом за циклом степень,выдает переполнение
как степень разложить???
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
20 июня 2008 в 20:01
Тема для группы "хреновые программисты"
19 июня 2008 в 8:05
можно было бы, конечно, поделить цикл на несколько частей, для каждой вычислить корень, а затем перемножить. но это потребует наличие в цикле дополнительного деления для определения необходимости разделения.
впрочем, если это для диплома, то хватит и написанного выше.
19 июня 2008 в 7:00
Вадим, быстрее-то быстрее, но автор говорит, что у него произведение переполняет вещественный тип. Поэтому и приходится извращаться.
19 июня 2008 в 0:05
что-то не то у вас с кодом. надо примерно так:
for i=1 to N
GAT = GAT + Log(S(i-1+LBound(S)))
Next i
GAT = Exp(GAT / (N + 1))
или так (если совсем страшно):
for i=1 to N
GAT = GAT + Log(eval("S" & i))
Next i
GAT = Exp(GAT / (N + 1))
19 июня 2008 в 0:02
сделал =)))
начальную GAT не првильно задал
Спасибо!!
19 июня 2008 в 0:01
СпаСибо всем,кто откликнулся!!!
будете смеяться-эту хрень надо реализовать для диплома подруги на VBA под экселем. Уже голову сломал.
короч
for i=1 to N
GAT = GAT + Log(S)
Next i
GAT = Exp(GAT / (N + 1))
не пашет
может я туплю
18 июня 2008 в 23:05
Если важна скорость работы, то мой вариант получше будет.Произведения, насколько я знаю, вычисляются гораздо быстрее, чем логарифмы.
18 июня 2008 в 23:05
Еще можно вместо стандартных вещественных типовиспользовать какую-либо библиотеку для вещественных чисел большой длины (можно ее и самому написать), но тогда все будет весьма и весьма медленно.
18 июня 2008 в 23:03
Думаю, идеи пригодятся многим, так что запощу решение и здесь..
GAT = exp(1/(N+1) * (ln s0 + ln s1 + ln s2 + … + ln sn))
Если жесткие требования к точности, то логарифмы надо складывать с помощью приоритетной очереди, а в зависимости от того, какого порядка числа S0, .., SN, может существовать более удачное решение, чем то, что я написал.
18 июня 2008 в 23:02
Примерно так:
p:=1;
for i=1 to N do p:=p*s[i];
GAT:=exp(ln(p)/(N+1));
18 июня 2008 в 23:01
идея зачетная,но не пашет
надо как-то делить расписать
18 июня 2008 в 23:00
а как в цикл зафигачить??
18 июня 2008 в 23:00
суммирование в цикле, а остальное – снаружи
18 июня 2008 в 22:05
так как все равно берется корень, то тебе поможет вот такая формула:
(a1*a2)^(1/b) = exp((ln(a1)+ln(a2))/b)