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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2012, 16:34   #1
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
Вопрос Задача н округление

Задача:
Выведите в выходной файл округленное до n знаков после десятичной точки число E. Число Е, округленное до 25 знаков после десятичной точки, равно 2.7182818284590452353602875.

Входной файл INPUT.TXT содержит целое число n (0 ≤ n ≤ 25).
Выходные данные

В выходной файл OUTPUT.TXT выведите ответ на задачу.

Мое пробное решение не принималось:

Код:
#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int n;
    freopen ("input.txt","r",stdin);
    freopen ("output.txt","w",stdout);
    cin >> n;
    double e = 2.7182818284590452353602875;
    double e_rounded = int(e*pow(10,n)+0.5)/pow(10,n);
    cout << e_rounded;
}
Позже решил проверить все значения:

Код:
#include<iostream>
#include<conio.h>
#include<math.h>
using namespace std;

int main()
{
    int n;
    //freopen ("input.txt","r",stdin);
    //freopen ("output.txt","w",stdout);
    double e = 2.7182818284590452353602875;
    for (n=0;n<=24;n++)
    {
    double e_rounded = int(e*pow(10,n)+0.5)/pow(10,n);
    cout << e_rounded << endl;
    }
    getch();
}
И на выходе получил вот что:
3
2.7
2.72
2.718
2.7183
2.71828
2.71828
2.71828
2.71828
-2.14748
-0.214748
-0.0214748
-0.00214748
-0.000214748
-2.14748e-005
-2.14748e-006
-2.14748e-007
-2.14748e-008
-2.14748e-009
-2.14748e-010
-2.14748e-011
-2.14748e-012
-2.14748e-013
-2.14748e-014
-2.14748e-015



Объясните пожалуйста, почему программа выдает это бред?

PS Просьба не предлагать другие решения. Я просто хочу разобраться именно в этой проблеме.
Смех без причины - признак Даламбера.

Последний раз редактировалось ACE Valery; 09.05.2012 в 17:28.
Qwoort вне форума Ответить с цитированием
Старый 09.05.2012, 18:22   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Это не бред. Действительные числа представляются в виде M * 2 ^ e (или не 2, не помню, но какое-то основание). Количество бит под M и e ограничено, потому так все и выводится.

P.S. а если у вас будет 1000 знаков после запятой, тоже так будете делать? Тут решение нужно совсем другое.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.05.2012, 07:36   #3
vitali0
 
Регистрация: 27.09.2010
Сообщений: 5
По умолчанию

можно воспользоваться такой функцией:
Код:
double Round(double val, int k) {
	double scale = pow(10.0, k);
	double round = floor(abs(val) * scale + 0.5);
	return (((val > 0)?1:((!val)?-1:0)) * round / scale);
}
где val - чилсо, k - требуемая точность
vitali0 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
округление с++ kop Общие вопросы C/C++ 3 14.05.2011 16:01
Округление Madina192 Microsoft Office Access 6 29.04.2011 12:28
Округление Farmokolog Общие вопросы Delphi 2 19.02.2011 16:08
Задача про округление объёма проданной газировки [Паскаль] balla Помощь студентам 0 04.12.2010 11:24
округление Toxa Общие вопросы Delphi 4 15.01.2007 19:15