Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 28.07.2012
Сообщений: 35

Функция возведения в степень

18.11.2012, 21:01. Показов 5808. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Ребята, помогите решить проблему.
Написал функцию для вычисления действительных корней кубического уравнения.
возникает непонятная ситуация в случае, когда дискриминант D > 0.
При извлечении корня третей степени, для нахождения коэффициентов, функция pow() в случае, когда основание
отрицательно, выдает какое-то левое число... ведь вроде и в основании и в показателе степени может содержаться любое число, как положительное, так и отрицательное, лишь бы оно было формата double:
double pow (double x, double y).

Вот код:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void qubic(void){
    double a, b, c, d;
    double r, s, t;
    double p, q, D;
    double ro, fi;
    double u, v;
    double x1, x2, x3;
    const double pi = 3.14159265;
    const double pw = 0.33333333;
 
    cout << "Введите коэффициент a: ";
    cin >> a;
    cout << "Введите коэффициент b: ";
    cin >> b;
    cout << "Введите коэффициент c: ";
    cin >> c;
    cout << "Введите коэффициент d: ";
    cin >> d;
    cout << "\n";
    
    r = b/a;
    s = c/a;
    t = d/a;
 
    p = s - r*r/3;
    q = 2*pow(r,3)/27 - r*s/3 + t;
    D = pow((p/3),3) + pow((q/2),2);
    cout << D << "\n";
    cout << p << "\n";
    cout << q << "\n";
    cout << r << "\n";
    if (D<0){
        ro = sqrt(-pow(p,3)/27);
        fi = acos(-q/(2*p));
        
        x1 = 2*pow(ro,pw)*cos(fi/3) - r/3;
        x2 = 2*pow(ro,pw)*cos(fi/3 + 2*pi/3) - r/3;
        x3 = 2*pow(ro,pw)*cos(fi/3 + 4*pi/3) - r/3;
 
        cout << "Корни уравнения: " << x1 << ", " << x2 << " и " << x3 << "\n";
    }
    else{
        u = pow(-q/2+sqrt(D),pw);
        cout << u << "\n";
        v = pow(-q/2-sqrt(D),pw);
        cout << v << "\n";
        
        cout << pow (-10.0, 0.3);       
        x1 = u + v - r/3;
 
        cout << "Корень уравнения: " << x1 << "\n";
    }
    return;
}
Собственно, я даже строку указал
C++
1
cout << pow (-10.0, 0.3);
- которая тоже каракули выдает, неужели основание должно быть строго положительно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2012, 21:01
Ответы с готовыми решениями:

Функция возведения в степень
В школе изучаем C++ и я её не понимаю. Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число...

Функция возведения в степень.
написал библиотеку для вычисления степени чисел.некорректно работает при возвращении переменной из step.h в main.cpp и переводе в другую. ...

Рекурсивная функция возведения в степень
Ребята, написал функцию для возведения в степень из учебника, но она почему-то не хочет работать. Вот код: int pow(int base, unsigned...

10
33 / 33 / 5
Регистрация: 16.11.2012
Сообщений: 59
19.11.2012, 03:39
http://devoid.com.ua/functions... s/pow.html
double pow(double x, double y)
Если x отрицательное, а y не является целой, функция печатает сообщение об ошибке DOMAIN в stderr, устанавливает errno в ERANGE и возвращает либо положительное, либо отрицательное значение HUGE.
0
2 / 2 / 0
Регистрация: 28.07.2012
Сообщений: 35
19.11.2012, 13:19  [ТС]
Что же теперь делать? Может имеется какая-то альтернативная функция?
Видел реализацию этого алгоритма на паскале, там же работает...
И насколько я понял в данном случае, например pow(x,y), аргумент 'y' нельзя поставить в виде выражения, например указать типа 1/3 - корень третей степени, я вышел из ситуации, подставив в формулу константное значение pw = 0.333333, насколько это корректно?
0
33 / 33 / 5
Регистрация: 16.11.2012
Сообщений: 59
19.11.2012, 14:13
А почему просто не воспользоваться тем, что (-x)1/3 == -(x)1/3? И возводить положительный х в степень 1/3.
0
2 / 2 / 0
Регистрация: 28.07.2012
Сообщений: 35
19.11.2012, 14:31  [ТС]
Я это учитывал! тут не все так просто, если я вынесу минус из под знака корня, это поможет лишь в одном случае...
\sqrt[3]{-q/2+\sqrt{D}}
\sqrt[3]{-q/2-\sqrt{D}}
Для второго корня это сработает... а в первом случае, хоть выноси, хоть не выноси, под корнем разность двух значений, и это значение не всегда будет положительно. Тем более q/2 может быть меньше значения дискриминанта, к тому же, оно очень часто получается отрицательным...
0
33 / 33 / 5
Регистрация: 16.11.2012
Сообщений: 59
19.11.2012, 14:36
Первая идея, что приходит это проверять знак этого выражения и в зависимости от знака вычислять по-разному, что-то типа:
C++
1
u = (-q/2+sqrt(D) > 0 ? 1 : -1) * pow(abs(-q/2+sqrt(D)), pw);
Возможно, есть более лаконичные способы.
1
2 / 2 / 0
Регистрация: 28.07.2012
Сообщений: 35
19.11.2012, 15:42  [ТС]
А вот это уже выход с тернарным оператором, спасибо большое, не додумался бы!

Добавлено через 32 минуты
Теперь надо с этим куском кода разобраться, вроде формулы ввел правильно, но программа считает неверно!
C++
1
2
3
4
5
6
7
8
9
10
 if (D<0){
        ro = sqrt(-pow(p,3)/27);
        fi = acos(-q/(2*p));
        
        x1 = 2*pow(ro,pw)*cos(fi/3) - r/3;
        x2 = 2*pow(ro,pw)*cos(fi/3 + 2*pi/3) - r/3;
        x3 = 2*pow(ro,pw)*cos(fi/3 + 4*pi/3) - r/3;
 
        cout << "Корни уравнения: " << x1 << ", " << x2 << " и " << x3 << "\n";
    }
Очевидно, какая-то функция некорректно работает... может косинус или арккосинус не принимают аргументы в в виде выражений или отрицательные...
0
33 / 33 / 5
Регистрация: 16.11.2012
Сообщений: 59
19.11.2012, 15:49
Проверьте, везде ли правильно формулы записаны. Каким методом корни рассчитываются?
0
2 / 2 / 0
Регистрация: 28.07.2012
Сообщений: 35
19.11.2012, 15:50  [ТС]
Кстати, небольшая поправочка, надо использовать функции fabs(), а не abs(), так как мы передаем аргумент вещественного типа, а не целого!
1
33 / 33 / 5
Регистрация: 16.11.2012
Сообщений: 59
19.11.2012, 15:54
Да, точно, там нужен fabs
0
2 / 2 / 0
Регистрация: 28.07.2012
Сообщений: 35
19.11.2012, 16:05  [ТС]
Проблему решил, я неправильно записал формулу, вместо коэффициента Ро, подставил коэффициент р... в этом месте:
C++
1
fi = acos(-q/(2*p));
а надо так:
C++
1
fi = acos(-q/(2*ro));
Решал задачу методом Кардано.

Вроде пока вопросы исчерпаны, спасибо Peregrin

Может кому надо, для нахождения действительных корней кубического уравнения, код функции:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void qubic(void){
    double a, b, c, d;
    double r, s, t;
    double p, q, D;
    double ro, fi;
    double u, v;
    double x1, x2, x3;
    const double pi = 3.14159265;
    const double pw = 0.33333333;
 
    cout << "Введите коэффициент a: ";
    cin >> a;
    cout << "Введите коэффициент b: ";
    cin >> b;
    cout << "Введите коэффициент c: ";
    cin >> c;
    cout << "Введите коэффициент d: ";
    cin >> d;
    cout << "\n";
    
    r = b/a;
    s = c/a;
    t = d/a;
 
    p = s - r*r/3;
    q = 2*pow(r,3)/27 - r*s/3 + t;
    D = pow((p/3),3) + pow((q/2),2);
    
    if (D<0){
        ro = sqrt(-pow(p,3)/27);
        fi = acos(-q/(2*ro));
        
        x1 = 2*pow(ro,pw)*cos(fi/3) - r/3;
        x2 = 2*pow(ro,pw)*cos(fi/3 + 2*pi/3) - r/3;
        x3 = 2*pow(ro,pw)*cos(fi/3 + 4*pi/3) - r/3;
 
        cout << "Корни уравнения: " << x1 << ", " << x2 << " и " << x3 << "\n";
    }
    else{
        u = (-q/2+sqrt(D) > 0 ? 1 : -1) * pow(fabs(-q/2+sqrt(D)),pw);
        v = (-q/2-sqrt(D) > 0 ? 1 : -1) * pow(fabs(-q/2-sqrt(D)),pw);
                    
        x1 = u + v - r/3;
 
        cout << "Корень уравнения: " << x1 << "\n";
    }
    return;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2012, 16:05
Помогаю со студенческими работами здесь

Функция возведения матрицы в степень
Просьба кто знает как такое реализовать напишите, уже сколько мучаюсь , а считает не правильно , мб у кого есть)

Функция возведения в целую степень
как возвести в степень 2^3 + 5^3 через цикл for без функции Pow.

Рекурсивная функция возведения в степень
Мое задание: Вычислить y = x^n(икс в степени n) по следующему правилу: y = ( x^n/2 )^2, если n четное и y = x * y^(n–1), если n...

Не подключается функция возведения в степень pow
#include &lt;math.h&gt; L=sqrt(pow(x-x0)+pow(y-y0)); Почему не подключаеться функция возведениЯ в степень pow, кто...

Функция для возведения в степень (стыдно)
Здравствуйте. Нужно написать программу, которая читает два целых значения (основание и показатель степени) и выдаёт результат, используя...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru