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

Вопрос по программе. Нужно протабулировать ф-цию - C++

Восстановить пароль Регистрация
 
Xeon1024
0 / 0 / 0
Регистрация: 25.09.2010
Сообщений: 4
25.09.2010, 22:43     Вопрос по программе. Нужно протабулировать ф-цию #1
Приветствую вас дамы и господа
Тут такое дело...

Задание:
Вопрос по программе. Нужно протабулировать ф-цию

Код:
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
# include <iostream.h>
# include <conio.h>
# include <math.h>
 
// Считает значение функции
float Schet_F(float X)
{
 if (X + 5 < 0) return 1/(2 * X) - 10;
 else return (X - sin(X)) / X;
}
 
// Херачит цикл и выводит табулирование
void While_F (float X_s, float X_e, float X_st)
{
 while (X_s <= X_e)
 {
  if (X_s != 0)
  {
  cout<< "x= "<< X_s<< "   ";
  cout<< "F(x)= "<< F(X_s)<< endl;
  X_s = X_s + X_st;
  }
 }
}
 
// Майн...ну что тут сказать...
void main(void)
{
clrscr();
float X_start, X_end, step_X;
cout<< "X_start= "; cin>> X_start;
cout<< "X_end= "; cin>> X_end;
cout<< "step_X= "; cin>> step_X;
While_F(X_start, X_end, step_X);
getch();
}
Результат работы:
Вопрос по программе. Нужно протабулировать ф-цию

Вопросы:
- Почему когда Х должен быть равен -0,1 он равен -0,099999 ?
- Почему выводится Х, когда он равен нулю?
- Почему не выводится конечное значение Х (последняя строка)?


 Комментарий модератора 
Во избежании потери материалов на сторонних ресурсах заливайте изображения на форум через Вложения в расширенном режиме редактирования сообщений.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
25.09.2010, 23:13     Вопрос по программе. Нужно протабулировать ф-цию #2
У Вас объявлена функция Schet_F, но я не вижу что вы её где то использовали в коде, т.е. обращались к ней
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.09.2010, 23:19     Вопрос по программе. Нужно протабулировать ф-цию #3
Что-то мне подсказывает...

C++
1
 cout<< "F(x)= "<< Schet_F(X_s)<< endl;//В функции While_F
Xeon1024
0 / 0 / 0
Регистрация: 25.09.2010
Сообщений: 4
26.09.2010, 00:38  [ТС]     Вопрос по программе. Нужно протабулировать ф-цию #4
Да не...дело не в функциях. Вот...
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
# include <iostream.h>
# include <conio.h>
# include <math.h>
 
void main(void)
{
clrscr();
float X_s, X_e, st_X, F;
cout<< "X_start= "; cin>> X_s;
cout<< "X_end= "; cin>> X_e;
cout<< "step_X= "; cin>> st_X;
while (X_s <= X_e)
{
 if (X_s != 0)
 {
  if (X_s + 5 < 0) F = 1/(2 * X_s) - 10;
  else F = (X_s - sin(X_s)) / X_s;
 }
  cout<< "x= "<< X_s<< "   ";
  cout<< "F(x)= "<< F << endl;
  X_s = X_s + st_X;
}
 
getch();
}
Результат тот же
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
26.09.2010, 01:01     Вопрос по программе. Нужно протабулировать ф-цию #5
Цитата Сообщение от Xeon1024 Посмотреть сообщение
Почему выводится Х, когда он равен нулю?
Потому что он выводится всегда, cout стоит вне проверки if (X_s != 0)

Цитата Сообщение от Xeon1024 Посмотреть сообщение
Почему не выводится конечное значение Х (последняя строка)?
измени 12-ю строчку на: while (X_s <= (X_e+st_X))
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.09.2010, 01:21     Вопрос по программе. Нужно протабулировать ф-цию #6
Цитата Сообщение от Xeon1024 Посмотреть сообщение
- Почему когда Х должен быть равен -0,1 он равен -0,099999 ?
- Почему выводится Х, когда он равен нулю?
нужно округлять, свойство FPU, то что ровно в десятичной системе - отнюдь не ровно в двоичной

Цитата Сообщение от Xeon1024 Посмотреть сообщение
- Почему не выводится конечное значение Х (последняя строка)?
опять же, 0.9+0.1=1.00000000001
в таких случаях
либо
1) используют допуски
C++
1
abs(X_s - X_e)>1e-6
2)действия ведут в целых числах, а потом переводят в вещественные например делением
C++
1
2
3
4
int i=0;
while(i<10){
  cout << double(i)/10;
}
Xeon1024
0 / 0 / 0
Регистрация: 25.09.2010
Сообщений: 4
26.09.2010, 19:02  [ТС]     Вопрос по программе. Нужно протабулировать ф-цию #7
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
# include <iostream.h>
# include <conio.h>
# include <math.h>
 
// Считает значение функции
double Schet_F(double X)
{
 if (X + 5*100 < 0) return 1/(2 * X) - 10*100;
 else return (X - sin(X)) / X;
}
 
// Херачит цикл и выводит табулирование
void While_F (double X_s, double X_e, double X_st)
{
 while (X_s <= X_e)
 {
  if (X_s != 0)
  {
  cout<< "x= "<< X_s/100<< "   ";
  cout<< "F(x)= "<< Schet_F(X_s)/100<< endl;
  }
 X_s = X_s + X_st;
 }
}
 
// Майн...ну что тут сказать...
void main(void)
{
clrscr();
double X_start, X_end, step_X;
cout<< "X_start= "; cin>> X_start;
cout<< "X_end= "; cin>> X_end;
cout<< "step_X= "; cin>> step_X;
X_start = X_start * 100;
X_end = X_end * 100;
step_X = step_X * 100;
While_F(X_start, X_end, step_X);
getch();
}
Проверьте плз=) Так правильно?

Добавлено через 56 минут
И еще один вопрос. Почему,не умножая на 100, если вместо этого:
Цитата Сообщение от Xeon1024 Посмотреть сообщение
X_s = X_s + X_st;
Вставляешь это:
C++
1
2
   if ((-0.01 < X_s) && (X_s < 0)) X_s = 0;
   else X_s = X_s + X_st;
потеря точности остается?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2010, 19:38     Вопрос по программе. Нужно протабулировать ф-цию
Еще ссылки по теме:

C++ Вопрос по программе.
Описать математическую ф-цию C++
C++ Указатель на ф-цию в структуре

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.09.2010, 19:38     Вопрос по программе. Нужно протабулировать ф-цию #8
вы неправильно поняли, переход к целочисленной арифметике делают когда заранее известно число шагов

вам нужно вместо всех сравнений X_s == X_e использовать abs(X_s-X_e)<eps;
так вы сможете сравнивать числа

потеря точности естественна из-за ограниченности разрядной сетки ПК, при вычислениях sqrt(4.0) получается 3.99999999999999, но вы можете управлять выводом
printf( "%4.3f", res ); выведет ___4.000
cout.precision(3);
cout << res; сделает тоже самое
Изображения
 
Yandex
Объявления
26.09.2010, 19:38     Вопрос по программе. Нужно протабулировать ф-цию
Ответ Создать тему
Опции темы

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