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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2012, 16:27   #1
m.mshev
Новичок
Джуниор
 
Регистрация: 05.08.2012
Сообщений: 4
По умолчанию Не могу разобраться

Добрый день!
Я начал изучать С. И вот столкнулся с первой проблемой, никак не понять почему так происходит:
Код:
{

double a;

a=5/9;

printf("%f\n", a);

	return 0;
}

Результат деления 0.

Если сделать по другому:

{

double a;

a=5;
a=a/9;

printf("%f\n", a);

	return 0;
}
Результат 0.55, т.е. правильный. Почему так происходит? Код компилировал в VS 2008.

Последний раз редактировалось Stilet; 05.08.2012 в 18:57.
m.mshev вне форума Ответить с цитированием
Старый 05.08.2012, 16:35   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от m.mshev Посмотреть сообщение
Добрый день!
Я начал изучать С. И вот столкнулся с первой проблемой, никак не понять почему так происходит:

Код:
{

double a;

a=5/9;   //<--- внимательно смотрим сюда

printf("%f\n", a);

	return 0;
}

Результат деления 0.

Если сделать по другому:

{

double a;

a=5;
a=a/9;

printf("%f\n", a);

	return 0;
}
Результат 0.55, т.е. правильный. Почему так происходит? Код компилировал в VS 2008.
Рассмотрим выражение a=5/9;

магические цифры 5 и 9 имеют тип int

Сначала целое 5 будет разделяно на целое 9.

Полученный результат так же будет типа int
Дробная часть будет попросту отброшена. И останется ноль.

Измени этот код на: a=5/9.0;
_Bers вне форума Ответить с цитированием
Старый 05.08.2012, 16:37   #3
m.mshev
Новичок
Джуниор
 
Регистрация: 05.08.2012
Сообщений: 4
По умолчанию

Спасибо, теперь все понятно)

Можно еще один вопрос:
Код:
{
	float a;
	printf("Enter F ");
	scanf("%f", &a);
	printf("%.2f\n", (a-32.0)*(5.0/9.0));


	return 0;
}
Переводим фаренгейты в цельсия, все работает ок, но если поставить тип данных double:
Код:
{
	double a;
	printf("Enter F ");
	scanf("%f", &a);
	printf("%.2f\n", (a-32.0)*(5.0/9.0));


	return 0;
}
В результате: какое-то длинное число со знаком "-".

Насколько я понял double и float в сущности различаются количеством знаком после запятой и точностью. Но почему тогда в одном случае программа считает правильно, а в другом нет?

Последний раз редактировалось Stilet; 05.08.2012 в 19:00.
m.mshev вне форума Ответить с цитированием
Старый 05.08.2012, 17:01   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от m.mshev Посмотреть сообщение
Насколько я понял double и float в сущности различаются количеством знаком после запятой и точностью. Но почему тогда в одном случае программа считает правильно, а в другом нет?
double и float различаются типами. А не просто количеством возможных циферок.

тип double имеет размер 8 байт, а float только 4 байта.

Они по разному хранят внутри себя данные.

Ты передаешь в функцию адрес переменной типа double
А функция думает, что там - float, и она записывает по этому адресу данные так, как буд то бы там float.

Но поскольку для типа double данные хранятся по другому, то при дальнейшем чтении этих данных, тебе и выводится кракозябра всякая
_Bers вне форума Ответить с цитированием
Старый 05.08.2012, 17:09   #5
m.mshev
Новичок
Джуниор
 
Регистрация: 05.08.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
double и float различаются типами. А не просто количеством возможных циферок.

тип double имеет размер 8 байт, а float только 4 байта.

Они по разному хранят внутри себя данные.

Ты передаешь в функцию адрес переменной типа double
А функция думает, что там - float, и она записывает по этому адресу данные так, как буд то бы там float.

Но поскольку для типа double данные хранятся по другому, то при дальнейшем чтении этих данных, тебе и выводится кракозябра всякая
А как сделать так, чтобы функция записывала по этому адресу данные как double? И по чему функция думает, что там float?

Последний раз редактировалось m.mshev; 05.08.2012 в 17:12.
m.mshev вне форума Ответить с цитированием
Старый 05.08.2012, 17:22   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

может быть тебе что-то вроде вот такого нужно:

Код:
 double a=10;
    printf("Enter F ");
    scanf("%lf", &a);
    printf("%.2lf\n", a);
_Bers вне форума Ответить с цитированием
Старый 05.08.2012, 17:51   #7
m.mshev
Новичок
Джуниор
 
Регистрация: 05.08.2012
Сообщений: 4
По умолчанию

Все теперь, понял. Еще раз спасибо!
m.mshev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++: не могу разобраться...=( Алиса Ростова Помощь студентам 0 03.12.2011 15:27
Не могу разобраться!!! Яна Сафронова Помощь студентам 11 12.05.2010 17:56
не могу разобраться Инспектор ГУЛ Свободное общение 7 20.09.2009 09:29