Форум программистов, компьютерный форум CyberForum.ru

Вычислить формулу - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
12.09.2011, 11:14     Вычислить формулу #1
[LATEX]\frac{{x}^{k}}{k!}[\LATEX] Нужно расписать, чтобы не было переполнения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2011, 11:14     Вычислить формулу
Посмотрите здесь:

Вычислить формулу C++
C++ Вычислить формулу
C++ Вычислить формулу исльзуя подпрограмму
Вычислить рекуррентную формулу C++
Вычислить формулу C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zalogic
 Аватар для zalogic
144 / 140 / 2
Регистрация: 12.12.2010
Сообщений: 253
12.09.2011, 12:22     Вычислить формулу #2
латекс не работает...
напиши по обычному или картинкой
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
12.09.2011, 12:22     Вычислить формулу #3
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{x}^{k}}{k!}
Слеш нужно другой ставить
zalogic
 Аватар для zalogic
144 / 140 / 2
Регистрация: 12.12.2010
Сообщений: 253
12.09.2011, 13:04     Вычислить формулу #4
ну начнем так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
using namespace std;
 
double frac(double f){
int sum=1;
for (int i=1; i<=f; i++)
sum=sum*i;
return sum;
}
 
int main(){
double x=2;
double k=3;
double y= pow(x,k)/frac(k);
cout<<y;
return 0;
}
давайте условия переполнения придумаем сначала... а потом их решим.
http://www.codenet.ru/progr/cpp/spru/matherr.php

Добавлено через 26 минут
чето даже самому интересно стало... как то так что ли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cmath>
using namespace std;
 
double frac(double f){
int sum=1;
for (int i=1; i<=f; i++)
sum=sum*i;
return sum;
}
 
int main(){
double x=200;
double k=300;
double y;
int matherr (x)
 
register struct exception *x;
   {
     if (x->type==OVERFLOW) {
       if (!strcmp(x->name, "pow")) {
         x->retval=pow(-x->arg1);
         return(0); 
       }
     }
     return(0); 
   }
y=pow(x,k)/frac(k);
cout<<y;
return 0;
}
Кто -нибудь воткнул как эту функцию грамотно применять?)
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.09.2011, 13:42     Вычислить формулу #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
using namespace std;
 
double f(double x, int k)
{
    double frac = 1.0;
 
    for (int i = k; i > 0; --i)
        frac = frac * x / i;
 
    return frac;
}
 
int main()
{
    double x = 200.0;
    int k = 250;
    
    double y = f(x, k);
    cout << y << endl;
    
    return 0;
}
Переполнение, конечно, всё-равно возможно, но при больших x
zalogic
 Аватар для zalogic
144 / 140 / 2
Регистрация: 12.12.2010
Сообщений: 253
12.09.2011, 13:55     Вычислить формулу #6
ну вот я колдую с matherr :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <string.h>
using namespace std;
 
double frac(double f){
int sum=1;
for (int i=1; i<=f; i++)
sum=sum*i;
return sum;
}
 
int main(){
double x=200;
double k=300;
double y;
int matherr (matherrexpp);
 
register struct exception *matherrexpp;
   {
     if (matherrexpp->type==OVERFLOW) {
       if (!strcmp(matherrexpp->name, "pow")) {
         matherrexpp->retval=pow(-(matherrexpp->arg1));
         return(1); 
       }
     }
     return(0); 
   }
 
y=pow(x,k)/frac(k);
cout<<y;
return 0;
}
вылетают ошибки
source.cpp: In function 'int main()':
source.cpp:18:14: error: 'matherrexpp' was not declared in this scope
source.cpp:18:5: warning: unused variable 'matherr' [-Wunused-variable]

Build finished with errors
короче надо с matherr разобраться как-то как с ним работать и тогда топикстартерский вопрос будет решен.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.09.2011, 14:03     Вычислить формулу #7
Цитата Сообщение от zalogic Посмотреть сообщение
короче надо с matherr разобраться как-то как с ним работать и тогда топикстартерский вопрос будет решен.
ТС надо не обнаружить переполнение, а избежать его. Как в этом помогут исключения?
zalogic
 Аватар для zalogic
144 / 140 / 2
Регистрация: 12.12.2010
Сообщений: 253
12.09.2011, 14:21     Вычислить формулу #8
grizlik78, ну насколько я понял её специально и сделали для таких целей
matherr служит в качестве пользовательской
ловушки, (функции определяемой пользователем)
которую вы можете написать сами (смотрите пример).

matherr можно использовать для отслеживания ошибок
области определения и выхода за пределы диапазона,
происходящих в математических функциях. Она не
отслеживает исключительных ситуаций, возникающих
при работе со значениями с плавающей точкой
(например при делении на 0). Для отслеживания
таких ошибок смотри функцию signal.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.09.2011, 15:02     Вычислить формулу #9
Цитата Сообщение от zalogic Посмотреть сообщение
grizlik78, ну насколько я понял её специально и сделали для таких целей
Ну допустим обнаружили мы что переполнение произошло. Что дальше? Вывести сообщение об ошибке? Между тем при x = 600 и k = 500 дробь вполне вычисляется без переполнения double. Мой код выше. Этот код не сможет посчитать дробь только в том случае, если конечный результат не умещается в double, то есть результат можно считать бесконечным (для double) или использвать тип с большим диапазоном чисел.
zalogic
 Аватар для zalogic
144 / 140 / 2
Регистрация: 12.12.2010
Сообщений: 253
12.09.2011, 19:35     Вычислить формулу #10
Ну допустим обнаружили мы что переполнение произошло. Что дальше? Вывести сообщение об ошибке?
А ну хорошо, просто так и надо говорить тогда было ,что нужен какой-то алгоритм для расчета, а не просто в лоб использование каких-то переменных и функций из cmath с последующим применением исключений или ещё чего-то.

С возведением в степень проблем не будет.
так как например 2^20 это 2*2*2*2*...
Если просто сделать массив символов и потом каждый символ конвертировать в цифру и по шагам просто умножать. это не сложно.

Тоже и с факториалом получается...

Получается вся сложность с делением, так как мы будем делить строки, например:
324324543654675677879872341231414343242543
на
3243243244567788999999999999999909
хммм...

Добавлено через 4 часа 23 минуты
Алгоритм деления - предназначен для вычесления неполного частного и остатка от деления двух целых чисел.
http://ru.wikipedia.org/wiki/%D0%A4%...82%D0%BC%D1%8B
и тут ещё
http://forum.sources.ru/index.php?showtopic=210512&hl=

а нужен ли такой гемморой? Конечно все зависит от задачи, но в 99% случаев лучше сделать обработку исключения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2011, 22:22     Вычислить формулу
Еще ссылки по теме:

C++ Составить формулу по которой будет выводить уравнение. 2 Вычислить натуральное число n
Вычислить значение x:=sqrt(a), используя рекуррентную формулу / C++ C++
C++ Вычислить значение x:=sqrt(a), используя рекуррентную формулу / C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
12.09.2011, 22:22  [ТС]     Вычислить формулу #11
grizlik78, спасибо! Проблема временно решена.
Хотел так решить:
C++
1
2
tmp = pow(x, k);
for (int i = 1; i <= k; tmp /= i++);
, но при больших числах(x > 500, k > 100) негатив
Yandex
Объявления
12.09.2011, 22:22     Вычислить формулу
Ответ Создать тему
Опции темы

Текущее время: 08:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru