Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 01:47   #1
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию невыдает дробовое число

хочу написать программу для вычисления суммы ряда 1-1/3+1/5-1/7+1/9...
вроде как написал программу, но чото вычисления нету

Код:
#include "stdafx.h"
using namespace std;
int i;
long double x, sum, n;
int main()
{
cout<<"ryad\n";
cout<<"posl\n";
cin>>n;
for(i=1; i<=n; i++)
{
x=1/(2*i-1);
if ((i%2)==0 ) x=-1*x;
sum+=x;
}
cout<<sum;
getch();
}

Последний раз редактировалось Stilet; 06.02.2012 в 08:39.
noxior вне форума Ответить с цитированием
Старый 06.02.2012, 01:54   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от noxior Посмотреть сообщение
хочу написать программу для вычисления суммы ряда 1-1/3+1/5-1/7+1/9...
вроде как написал программу, но чото вычисления нету

#include "stdafx.h"
using namespace std;
int i;
long double x, sum, n;
int main()
{
cout<<"ryad\n";
cout<<"posl\n";
cin>>n;
for(i=1; i<=n; i++)
{
x=1/(2*i-1); // <---- внимательно смотрим сюда

//1 - это целое число. Оно имеет тип int
//2*i-1 - результат выражения тоже целое число. имеет тип int

//int/int - результат выражения тоже целое число.
// Целое число не имеет дробной части.
//По сути, дробная часть будет тупо отброшена.

//Итого: потеря данных.

//можно попытаться вылечить так: x= ((long double)1)/((long double)2*i-1);

//обилие скобочек приведены исключительно для иллюстрации
//последовательности преобразования типов

//Можно просто: (long double)1/(2*i-1);


if ((i%2)==0 ) x=-1*x;
sum+=x;
}
cout<<sum;
getch();
}
см комментарии в коде

Последний раз редактировалось _Bers; 06.02.2012 в 02:00.
_Bers вне форума Ответить с цитированием
Старый 06.02.2012, 02:04   #3
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию

благодарю....тоесть это не проблема в типе переменных? я всегда думал что оно само вычислять должно...это надо задать тип для конкретных чисел?
noxior вне форума Ответить с цитированием
Старый 06.02.2012, 02:59   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от noxior Посмотреть сообщение
благодарю....тоесть это не проблема в типе переменных? я всегда думал что оно само вычислять должно...это надо задать тип для конкретных чисел?
Тут не нужно "думать", тот нужно "понимать". Понимать идею:

((тип)(выражение));

Здесь, сначала будет вычислено выражение.
На с++ вообще все что в скобочках - это выражения. Выражения вычисляются, и заменяются "результатом выражения"

Поэтому, выше приведенная запись станет иметь вид:

((новый_тип) результат_выражения);

Результат_выражения тоже имеет конкретный тип данных.
Дальше идёт приведение: тип результа_выражения привести к типу, указанному слева.

В результате этого вычисления, результатом выражения окажется некий временный объект, типа новый_тип и имеющий значение результат_выражения.


Таким образом останется только последняя скобочка:

(Результа_выражения_нового_типа);

Так как здесь скобки уже роли не играют, то скобки убираются.

Получаем Результат_выражния_нового_типа.


Теперь более конкретный пример:

((float)(1/2));

Сначала высчитывается результат выражения (1/2) = (int 1)/ (int 2)
получится ноль.

Далее ноль, имеющий тип int приводится к типу float, получается 0.0f

Итого: результат 0.0f

Другой пример:

((int)(1/2.0f));

(int 1)/ (float) 2 в операции участвую два типа данных.
На самом деле должны участвовать одинаковые типы. Поэтому, происходит автоматическое преобразование типов.

Вопрос? Толи int во float, толи float в int ?

Правило преобразование простое: в результате преобразования не должно быть потерь данных.

Если в данном случае преобразовать в int, то float может потерять данные.
Если int во float - потерь данных не будет. Следовательно, компилятор преобразует int во float

Получаем:

(int 1)/(float 2) = (float 1) / (float 2) = (float 0.5)

Далее имеем: ((int)0.5f); число типа float преобразуется в int
Поэтому, дробная часть отбросится (0);

Результат вычисления - ноль.

/ps что бы не путаться с типами - просто смотри, какой тип будет результатом вычисления выражения. и если ты ожидаешь другой тип - делай приведение либо одного из участников операции, либо приведение результата_вычислений, и все будет окейно
_Bers вне форума Ответить с цитированием
Старый 06.02.2012, 03:31   #5
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию

ёпт, ну ты расписал красавчик....тут токо тугодуму небудет понятно, и то под вопросом.....навсяк случай скопировал, чтобы если шо было куда смотреть)))

те в преподы надо, люди умнее станут)
noxior вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из ячейки содержащей текст и число извлечь только число? АННА-ЕАО Microsoft Office Excel 35 02.12.2016 23:16
вводишь число- дает комбинацию из сумм различных чисел (от 1 до 10)составляющих это число Jonfree C++ Builder 0 05.12.2011 22:08
Написать программу, которая за меньшее число ходов отгадывает загаданное число gomz007 Помощь студентам 16 08.11.2009 12:57
Вывести число, предшествующее первому отрицательному и число, следующее за последним отрицательным Rid Паскаль, Turbo Pascal, PascalABC.NET 4 22.12.2008 16:50
Ввести число N и определить делится ли оно без остатка на число M (VBA) Ivanich Microsoft Office Excel 7 24.04.2008 19:43