Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
TECHNO
28 / 28 / 8
Регистрация: 04.11.2009
Сообщений: 366
1

Поиск точек графика функции на заданном интервале

28.12.2010, 14:26. Показов 3002. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Смысл программы: поиск точек графика функции y=(x^0.33)-(x+1)^0.33 на интервале.
Вопрос: почему начиная с наименьшего значения отрезка значений икс (сказанул) до нуля программа выдает результат типа: -1.IND0000000000. После нуля значения идут вразумительные значения
Я использовал float, но когда использовал double была также фигня
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <conio.h>
#include <stdio.h>
#include <math.h>
int main()
{
    int i;
    float x=-1.95;
    float y;
    for(i=0;i<50;i++)
    {
                     x+=0.05;
                     float y=pow(x,0.33)-pow((x+1),0.33);
                     printf("x = %5.4f\ny = %20.14f\n",x,y);
    }
    x=1;
    y=pow(x,(1/3))-pow((x+1),(1/3));
    printf("x = %5.4f\ny = %15.14f\n",x,y);
    getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2010, 14:26
Ответы с готовыми решениями:

Табулирование функции на заданном интервале
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; main(int argc, char * argv) {...

Табулирование функции на заданном интервале
Добрый день мне нужна помощь! Кому не трудно пожалуйста помогите! Нужно протабулировать функцию...

Расчитать значение функции на заданном интервале
Задание: Рассчитать значение функции на заданном интервале в n точках. Границы интервала задаются...

Вывести таблицу значений функции на заданном интервале
Доброго вечера. Написала код, но не могу проверить до конца простой подстановкой. Путаюсь, взгляд...

21
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
28.12.2010, 14:37 2
получается, что степень 0.33 - это 33/100, то есть ты отрицательное число x возводишь в 33 степень - получается опять же отрицательное число, а потом от него пытаешься вычислить корень четной степени - а это математически неверно
1
TECHNO
28 / 28 / 8
Регистрация: 04.11.2009
Сообщений: 366
28.12.2010, 14:52  [ТС] 3
тогда как вообще считать корни выражений степеней больше двух? Даже если я напишу pow(x,0.4) или (x,0.16) (возвожу в четную степень и извлекаю корен четной степени), то все равно на отрицательных значениях икс - чушь
0
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
28.12.2010, 14:56 4
видимо внутреннее устройство pow() так себя ведет.
0,4 = 2/5, сначала y=pow(x,2) потом pow(y,0.2) - так работает.
1
TECHNO
28 / 28 / 8
Регистрация: 04.11.2009
Сообщений: 366
28.12.2010, 15:06  [ТС] 5
deadlock, спасибо, конечно, но все равно проблему это не решило. Я думал, что с помощью pow можно любую степень извлекать, а оказалось, что нельзя толком извлечь даже кубический корень 0_0
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.12.2010, 15:31 6
Цитата Сообщение от Василий-Робот Посмотреть сообщение
Я думал, что с помощью pow можно любую степень извлекать, а оказалось, что нельзя толком извлечь даже кубический корень 0_0
http://www.manpagez.com/man/3/pow/

pow(x, y) returns a NaN and raises the "invalid" floating-point exception for finite x < 0 and finite non-integer y.
К тому же запись 1/3 в конечном счёте означает ноль, поскольку делается целочисленное деление. Нужно писать "1.0/3" (или "1.0/3.0")
1
TECHNO
28 / 28 / 8
Регистрация: 04.11.2009
Сообщений: 366
28.12.2010, 15:37  [ТС] 7
Evg, я написал, как сказали вы:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <conio.h>
#include <stdio.h>
#include <math.h>
int main()
{
    int i;
    double x=-1.95;
    for(i=0;i<50;i++)
    {
                     x+=0.05;
                     double y=pow(x,(1.0/3.0))-pow((x+1),(1.0/3.0));
                     printf("x = %g\ny = %g\n",x,y);
    }
    getch();
    return 0;
}
Результат до нуля опять очень кривой
0
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
28.12.2010, 15:40 8
скачай библиотеку gmp))
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.12.2010, 16:07 9
Цитата Сообщение от Василий-Робот Посмотреть сообщение
Результат до нуля опять очень кривой
Забыл главное написать. В общем случае нельзя отрицательное число возводить в нецелую степень. Для этого нужно руками знак менять. В твоём случае, грубо говоря, для отрицательного x нужно пользоваться формулой "x^(1/3) = -((-x)^(1/3))"
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
28.12.2010, 16:48 10
Василий-Робот, вы математику не знаете? При извелечении корня из отрицательного числа ответ получается в виде комплексного числа ( i ). Попробуйте на калькуяторе сделать, то, что пытаетесь в коде, наверное удивитесь)))
0
TECHNO
28 / 28 / 8
Регистрация: 04.11.2009
Сообщений: 366
28.12.2010, 17:29  [ТС] 11
Моя математика прекрасна И если посчитать в калькуляторе кубический корень из минуса двух (например), то ответ будет -1.25992105.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
28.12.2010, 17:34 12
Вы попробуйте, например, в Windows калькуляторе, который знает математику.

Добавлено через 2 минуты
кубический корень из минуса двух (например), то ответ будет -1.25992105.
а правильный ответ https://www.cyberforum.ru/cgi-bin/latex.cgi?{i}^{2}+1.25992105, где https://www.cyberforum.ru/cgi-bin/latex.cgi?{i}^{2}=-1
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.12.2010, 17:49 13
Kastaneda, во-первых, ответ-то неверный, ибо ваша запись равна 0,25599..., что не есть кубический корень из -2. Скорее всего вы вместо "*" поставили "+". А во-вторых, арифметический кубический корень из -2 прекрасно представляется без комплексных чисел, только в действительных, и равен, как уже было сказано, -1,25992104... То, что калькулятор может вычислить его в таком виде, как привели вы, это, скорее всего, особенность численного метода, который в нём применяется
2
TECHNO
28 / 28 / 8
Регистрация: 04.11.2009
Сообщений: 366
28.12.2010, 17:53  [ТС] 14
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
#include <conio.h>
#include <stdio.h>
#include <math.h>
int main()
{
    int i;
    double x=-1.95;
    for(i=0;i<50;i++)
    {
                     x+=0.05;
                     if (x<-1)
                     {
                     double y=-(pow(-x,(1.0/3.0))-pow(-(x+1),(1.0/3.0)));
                     printf("x = %g\ny = %g\n",x,y);
                     }
                     else
                     {
                     if (x<0 && x>-1)
                     {
                     double y=-pow(-x,(1.0/3.0))-pow((x+1),(1.0/3.0));
                     printf("x = %g\ny = %g\n",x,y);
                     }
                     else
                     {
                     if (x>0)
                     {
                     double y=pow(x,(1.0/3.0))-pow((x+1),(1.0/3.0));
                     printf("x = %g\ny = %g\n",x,y);
                     }
                     else
                     {
                     if (x==0)
                     {
                     double y=pow(x,(1.0/3.0))-pow((x+1),(1.0/3.0));
                     printf("x = %g\ny = %g\n",x,y);
                     }    
                     }
                     }
                     }
                             
    }
    getch();
    return 0;
}

Kastaneda, не буду спорить, ибо у меня для этого нет базы, комплексные числа мы будем проходить в следующем семестре.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
28.12.2010, 17:55 15
Цитата Сообщение от silent_1991 Посмотреть сообщение
Скорее всего вы вместо "*" поставили "+".
ага


silent_1991, не берусь с тобой спорить по части матемаике, но Windows калькулятор (calc.exe) солидарен со мной)

Цитата Сообщение от silent_1991 Посмотреть сообщение
А во-вторых, арифметический кубический корень из -2 прекрасно представляется без комплексных чисел, только в действительных, и равен, как уже было сказано, -1,25992104...
-1,25992104 * -1,25992104== - * - = + , а должно быть минус.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.12.2010, 17:58 16
Kastaneda, так, а мы какой корень-то всё-таки вычисляем?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
28.12.2010, 18:01 17
Василий-Робот, сейчас глянул, википедия говорит, что можно извлечь корень из орицательного числа, если степень корня не четная, так что неправильный результат при pow(x,(1.0/3.0)) - это похоже особенность реализации ф-ции pow()

Добавлено через 1 минуту

Не по теме:

silent_1991, да, заморочился)), но calc.exe все равно этого не умеет, хотя должен)

0
silent_1991
28.12.2010, 18:02
  #18

Не по теме:

Kastaneda, да calc.exe много чего не умеет...

0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.12.2010, 18:05 19
Василий-Робот, а не проще ли написать функцию типа

C
1
2
3
4
5
6
7
8
/* Вычисление кубического корня из числа x */
double my_pow13 (double x)
{
  if (x >= 0)
    return pow (x, 1.0/3.0);
  else
    return - pow (-x, 1.0/3.0);
}
?

Добавлено через 2 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
Василий-Робот, сейчас глянул, википедия говорит, что можно извлечь корень из орицательного числа, если степень корня не четная, так что неправильный результат при pow(x,(1.0/3.0)) - это похоже особенность реализации ф-ции pow()
1.0/3.0 в плавющем машинном хранится лишь приблизительно (т.е. это НЕ эквивалентно математическому значению 1/3). А потому pow в принципе не может работать математически правильно с корнями целых степеней.
0
TECHNO
28 / 28 / 8
Регистрация: 04.11.2009
Сообщений: 366
28.12.2010, 18:29  [ТС] 20
Evg, в данном случае (ваш код) не проще. Так как мы извлекаем кубический корень из (1+x) и там знаки меняется не так как в функции x. Можно при x и x+1 держать числа a и b соответственно, чтобы возвращать их значение -1 или 1
0
28.12.2010, 18:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2010, 18:29
Помогаю со студенческими работами здесь

Вывести таблицу значений функции на заданном интервале
Прошу,помогите не вылететь из института пожалуйста ((( Заранее благодарен Для функции...

Найти значение минимума функции на заданном интервале (дихотомия)
Разработать программу, находящую значение минимума значения функции на заданном интервале. Метод...

Вычислить и вывести в виде таблицы значения функции F в заданном интервале
Помогите пожалуйста! Нужно Вычислить и вывести в виде таблицы значения функции F на интервале от...

Вычислить и вывести на экран в виде таблицы значения функции f на заданном интервале
Надо сделать эту задачу через структуру, помогите надо срочно отдать


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru