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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2011, 19:19   #1
Kyj
Пользователь
 
Регистрация: 06.06.2011
Сообщений: 26
По умолчанию Поясните новичку

Написал простую программу по отображении числа с плавающей точкой в десятичном виде и в экспоненциальной. Но в результате в десятичном отображении неверный результат.


Код:
#include <stdio.h>

int main(void)
{

 float fl;

 printf("Введите пожалуйста число с плавающей точкой: ");
 scanf("%f", &fl);
 printf("Ввод будет %f или %e\n", fl, fl);

 getchar();
 getchar();
 return 0;
}
Вот результат:

Введите пожалуйста число с плавающей точкой: 50.678
Ввод будет 50.678001 или 5.067800е+001


Почему отображается единица в конце?

Последний раз редактировалось ACE Valery; 08.06.2011 в 10:49.
Kyj вне форума Ответить с цитированием
Старый 06.06.2011, 20:11   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Все правильно, это погрешность.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 06.06.2011, 20:29   #3
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Десятичный результат немного округляется. Попробуйте использовать long double вместо float.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 06.06.2011, 21:03   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Попробуйте использовать long double вместо float.
double вполне хватит; а также как вы собираетесь его считывать?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 06.06.2011, 21:29   #5
Kyj
Пользователь
 
Регистрация: 06.06.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Десятичный результат немного округляется. Попробуйте использовать long double вместо float.
Спасибо, сейчас попробую.


Цитата:
Сообщение от Syuf Посмотреть сообщение
double вполне хватит; а также как вы собираетесь его считывать?
Функцией scanf().
Kyj вне форума Ответить с цитированием
Старый 06.06.2011, 21:40   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Функцией scanf()
Это понятно, с каким спецификатором формата?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 06.06.2011, 22:03   #7
Kyj
Пользователь
 
Регистрация: 06.06.2011
Сообщений: 26
По умолчанию

Работает!!! Спасибо за помощь.

long double fl;
printf("Введите пожалуйста число с плавающей точкой: ");
scanf("%Lf", &fl);
printf("Ввод будет %Lf или %Le\n", fl, fl);

Появилась еще проблема.
Вот пример программы, которая считывает IP и выводит его на печать:

Код:
#include <stdio.h>

int main(void)
{
	int q, w, e, r;

	printf("Введите IP: ");
	scanf(" %d. %d. %d. %d", &q, &w, &e, &r);
	printf("IP: %d.%d.%d.%d\n",  q, w, e, r);

	getchar();
	getchar();
	return 0;
}
Это работает. Попытался задействовать цикл while. Не хочет работать. Сразу подозрения упали на функцию scanf(), аля точка же не служебный символ. Короче мозг кипит второй день. Как заставить считывать цифры, пропуская точки?
Вот пример с неработающим циклом:

Код:
#include <stdio.h>

int main(void)
{
	int q, w, e, r;

	printf("Введите IP: ");

	while(scanf(" %d. %d. %d. %d", &q, &w, &e, &r) == 1)
	{
		printf("IP: %d.%d.%d.%d\n",  q, w, e, r);
		printf("Введите IP: ");
	}

	return 0;
}

Последний раз редактировалось Stilet; 08.06.2011 в 14:30.
Kyj вне форума Ответить с цитированием
Старый 08.06.2011, 10:59   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Почему вы сравниваете возвращаемый функцией scanf() результат с единицей?
Вот для справки scanf()
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 08.06.2011, 11:16   #9
Kyj
Пользователь
 
Регистрация: 06.06.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Почему вы сравниваете возвращаемый функцией scanf() результат с единицей?
Это проверка истинности. Если вводится несоответствие спецификатору, то scanf() возвращает 0 (ноль).
Kyj вне форума Ответить с цитированием
Старый 08.06.2011, 11:19   #10
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Kyj Посмотреть сообщение
Это проверка истинности. Если вводится несоответствие спецификатору, то scanf() возвращает 0 (ноль).
А теперь почитайте, что написано по ссылке, которую я привел выше, и узнаете, что возвращает scanf()
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поясните прогу Sobaka_ru Помощь студентам 4 16.12.2010 23:36
Поясните по ассемблеру Namolem Помощь студентам 1 10.10.2010 12:11
Поясните код... Masip Общие вопросы Delphi 1 18.05.2010 07:22
Поясните по getdir AK BULLETS Общие вопросы Delphi 2 19.03.2010 14:16
Поясните ООП sodd Общие вопросы Delphi 1 23.02.2009 14:14