Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возведение числа в отрицательную дробную степень 
V
    Опции темы
alex_asker
  Дата 30.11.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



        Добрые люди, подскажите, пожалуйста, как прописать возведение значения Эйлера "е" в отрицательную дробную степень, например -0.0002.

Я делал следующим образом:

Код

double stepen(double x, double y)
{
double rez=1;
        for (double i=0;i<y;i++)
            rez*=x;
        if (y==0) rez=1;
return rez;
};


И далее:

Код

r=stepen(e,(-0.0002));


        Это возведение используется в довольно внушительной величины формуле. В данном случае выполняемое приложение зависает и считать формулу совсем не хочет. А вот если просто убрать знак "-" в степени, то все замечательно работает.
Помогите, пожалуйста, кто знает!

Это сообщение отредактировал(а) alex_asker - 30.11.2008, 15:56
PM MAIL   Вверх
theworldcreator
Дата 30.11.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Честно сказать не стал вникать в ваш алгоритм, но с точки зрения алгебры можно:
Если степень < 0, умножить на ее -1 и поделить единицу на число, которое мы возводим в степень
Применить ваш алгоритм, который уже не столкнется с отрицательными степенями.

PM MAIL WWW ICQ   Вверх
Fazil6
Дата 30.11.2008, 16:36 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60






y в степени x вычисляется выражением

Код

#include <math.h>

...

double z = exp(x * log(y)) ; 


PM MAIL   Вверх
theworldcreator
Дата 30.11.2008, 16:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



P.S. основы алгебры:
1/n = n^-1
(1/n)^m = n^-m

^ - значок степени
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 30.11.2008, 16:47 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(alex_asker @  30.11.2008,  15:55 Найти цитируемый пост)
 А вот если просто убрать знак "-" в степени, то все замечательно работает.

как это может работать? Каким образом такой алгоритм может в дробную степень возводить?Это алгоритм возведения в целочисленную степень. 
PM MAIL   Вверх
Dmi3ev
Дата 30.11.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



а почему нельзя использовать функцию???
Код

#include <math.h>
//...
int main()
{
//...
double x=2.7;
double y=-0.0002;
double res=pow(x, y);
//...
return 0;
}


Это сообщение отредактировал(а) Dmi3ev - 30.11.2008, 17:05


--------------------

PM MAIL   Вверх
Tunin
Дата 30.11.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 22.11.2008

Репутация: нет
Всего: нет



дел

Это сообщение отредактировал(а) Tunin - 30.11.2008, 18:45
PM MAIL   Вверх
alex_asker
Дата 30.11.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



     Я вас понял. Спасибо большое, много правильных ответов!  smile   
     Видите ли какое дело, всякими способами пробую на простой формуле возвести в степень (ну, например, как вы все здесь писали) и все работает!      НО стоит только мне подвести результаты в мою длиннющую с множеством циклов формулу, то приложение виснет, а вот если минус уберу, то не виснет и считает, но уже конечно неправильно. Циклы мощные (5000 результатов по формуле выводят), может поэтому и виснет сразу? Может тут переполнение памяти какое-то, я не разбираюсь.... smile 

Это сообщение отредактировал(а) alex_asker - 30.11.2008, 22:09
PM MAIL   Вверх
mrbrooks
Дата 1.12.2008, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



alex_asker, если приложение с гуем - тогда юзай дополнительный поток для своей функции
PM MAIL   Вверх
alex_asker
Дата 1.12.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



     Fazil6, я теперь уже и сам понимаю, что такой алгоритм в дробную степень не должен возводить. Может вы знаете, как тогда в дробную возвести???
PM MAIL   Вверх
Usper
Дата 1.12.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Смотри пост Dmi3ev, универсальная функция для возведения в степень (целую, дробную, отрицательную) - pow().


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
alex_asker
Дата 1.12.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



       Я новичок в программировании, но все, что здесь было предложено (pow или экспонирование логарифмов) я пробовал на своем коде, результат тот же. Я уверен, что какая-то самая малая ошибка мешает мне сделать правильный код, не могу ее найти, поэтому и обратился к вам.
       Вот мой код (я его не переделывал - это я про   i=0;i<y;):

Код

#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
double stepen(double x, double y);
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
double stepen(double x, double y)
{
double rez=1;
        for (double i=0;i<y;i++)
            rez*=x;
        if (y==0) rez=1;
return rez;
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int p;
double r1,r2,n,T0,Tk,a,b,T,r,Kg,c,step,e;
AnsiString s1,s2;
s1=Edit1->Text;
s2=Edit2->Text;
p=1;
n=60;
r1=StrToFloat(s1)/n;
r2=StrToFloat(s2)/n;
T0=500;
Tk=0.1;
T=0.1;
step=0.1;
e=2.718281828459045;
r=stepen(e,(-T/T0));
a=0.1;
b=0.1;

m: Kg=T0*((1-r)/(T+(Tk/n)+r*a*(r1+(Tk/n))+(1-r)*(1-b)*(r2+(Tk/n))+(1-r)*b*(T+(Tk/n)+r2)+(Tk/n)));
c=-1;
if (Kg>c)
{c=Kg;
 T=T+step;
 goto m;}
else
RichEdit1->Lines->Add(" " +IntToStr(p)+ ".  T0= " +        FloatToStr(T0)+ ";    Tk= " 
+FloatToStr(Tk)+ ";    a= " +FloatToStr(a)+ ";    b= " +FloatToStr(b));
RichEdit1->Lines->Add(" T= " +FloatToStr(T)+ ";      Kg= " +FloatToStr(Kg));
b=b/10;
p=p+1;
if (b<0.00001)
{a=a/10;
 b=0.1;}
else goto m;
if (a<0.00001)
{Tk=Tk+step;
 a=0.1;
 b=0.1;}
else goto m;
if (Tk>1)
{T0=T0+500;
 Tk=0.1;
 a=0.1;
 b=0.1;}
else goto m;
if (T0>10000)
{RichEdit1->Lines->Add("");
 RichEdit1->Lines->Add(" Окончание расчетов");}
 else goto m;


 
       В общем, что не так пишите (если конечно есть соображения как исправить), буду премного благодарен!!!  
PM MAIL   Вверх
Usper
Дата 2.12.2008, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



Не особо разбирался в коде, однако:

Код

double stepen(double x, double y)
{
double rez=1;
        for (double i=0;i<y;i++)
            rez*=x;
        if (y==0) rez=1;
return rez;
};

Эта функция в принципе не способна правильно возвести ни в дробную ни в отрицательную степень.

Здесь:
Код

m: Kg=T0*((1-r)/(T+(Tk/n)+r*a*(r1+(Tk/n))+(1-r)*(1-b)*(r2+(Tk/n))+(1-r)*b*(T+(Tk/n)+r2)+(Tk/n)));
c=-1;
if (Kg>c)
{c=Kg;
 T=T+step;
 goto m;}

получается бесконечный цикл. Слишком сложная и непонятная формула, чтобы понять что именно здесь не так. Но кажется Kg всегда больше нуля, а c=-1, поэтому условие (Kg>c) всегда истина.
На мой взгляд использование оператора goto здесь неоправдано, лучше использовать цикл do...while.
З.Ы. Да, кстати, функция возведения в степень вызывается всего один раз, поэтому можно один раз вычислить r на калькуляторе (r=0.99980002) и забить на эту функцию.
З.Ы.Ы. Что программа должна делать? Что это за формула?

Это сообщение отредактировал(а) Usper - 2.12.2008, 10:12


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
alex_asker
Дата 2.12.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



    Usper, ну, во-первых, это формула, в которой необходимо найти при каком Т, Kg будет максимальной, поэтому изначально я и сравниваю Kg с отрицательным значением (т.к. оно наверняка >) и далее увеличиваем Т по шагу, пока не найдем максимум Kg, т.е. пока Kg не станет< c.
    Во-вторых, возведение в степень происходит неоднократно, т.к. после формулы добавлено еще циклов на 5000 решений:
Код

b=b/10;
p=p+1;
if (b<0.00001)
{a=a/10;
 b=0.1;}
else goto m;
if (a<0.00001)
{Tk=Tk+step;
 a=0.1;
 b=0.1;}
else goto m;
if (Tk>1)
{T0=T0+500;
 Tk=0.1;
 a=0.1;
 b=0.1;}
else goto m;
if (T0>10000)
{RichEdit1->Lines->Add("");
 RichEdit1->Lines->Add(" Окончание расчетов");}
 else goto m;


    А на счет функции я и сам не уверен, что она верна:
Код

double stepen(double x, double y)
{
double rez=1;
        for (double i=0;i<y;i++)
            rez*=x;
        if (y==0) rez=1;
return rez;
};


    Поэтому и ищу ответа на этом форуме.
    Вот такие дела.....

Это сообщение отредактировал(а) alex_asker - 2.12.2008, 23:00
PM MAIL   Вверх
Dmi3ev
Дата 3.12.2008, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

 А на счет функции я и сам не уверен, что она верна:

Конечно, неверна, у Вас i будет увеличиваться на единицу, дробным это значение не должно стать)))
Например если x=2, а y=2.2, то, по-моему, должно получиться 4, а должно 2^(2,2)
 smile 
goto - стремная штука, а когда назад возвращаешься с помощью goto - это вдвойне стремная штука, это мое мнение.


--------------------

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.