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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2012, 21:05   #1
EnterFix
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 22
Вопрос Неверное деление (3/2=1)

В программе есть инструкция, в котором 1 делится на n. Но я заметил, что в итоге ответ неверный. Для проверки ввёл переменную float tmpp и инструкцию tmpp=3/2; Выполнил трассировку и увидел такую картину (скриншот).

Решил поставить другие числа. В итоге 4/2=2, 1/2=0, 1/n=0 и т.д.
Такое ощущение, что специально отбрасывается число после запятой (как будто это int).

Среда программирования- Embarcadero RAD Studio XE2

P.S. Пока писал сообщение на форум, решил сделать так
Код:
float tmpp=(float)3/2;
Помогло! Ответ-1.5. Но зачем здесь явное приведение типов??? Никогда с подобным не сталкивался. Всегда писал "a/b" и всё было норм.
Изображения
Тип файла: jpg Безымянный.jpg (319.9 Кб, 123 просмотров)
EnterFix вне форума Ответить с цитированием
Старый 01.10.2012, 21:12   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

3 и 2 это int числа. Целочисленное деление отрезает дробную часть.
Обойти можно скажем так:
2.0 / 2.0
это уже float числа и результат будет тоже float
waleri вне форума Ответить с цитированием
Старый 01.10.2012, 21:21   #3
EnterFix
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 22
По умолчанию

Хм... ясно. Спасибо)
Видимо я никогда не присваивал float переменной деление целых чисел (делил только дробные). Поэтому не знал об этом нюансе.
Я так полагаю, что
2.0/2
результат float? (это для уточнения))
EnterFix вне форума Ответить с цитированием
Старый 01.10.2012, 21:31   #4
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

В этом случае результат int
Axrik вне форума Ответить с цитированием
Старый 01.10.2012, 22:24   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Axrik, вы уверены, что деление 2.0/2 имеет тип Int? Типы же приводятся к большему (конечно есть множество оговорок).
http://algcourse.cs.msu.su/wp-conten...tions04-05.pdf
С 21 страницы и далее про приведение
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 01.10.2012 в 22:29.
BDA на форуме Ответить с цитированием
Старый 01.10.2012, 22:33   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Axrik, вы уверены, что деление 2.0/2 имеет тип Int? Типы же приводятся к большему (конечно есть множество оговорок).
Да, ну.
Результат 3/2 и 3.0/2.0 будет разным по одной постой причине. В первом случае деление происходит с целочисленными величинами и мантисса отбрасывается 3/2 = 1. Во-втором случае, вычисляется значение типа float или double (смотря как объялена переменная, которой присваивается результат). И он будет соответствовать - 1.5.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 01.10.2012 в 22:35.
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.10.2012, 22:36   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Smitt&Wesson, именно это я и пытаюсь донести до Axrik.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.10.2012, 22:38   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Smitt&Wesson, именно это я и пытаюсь донести до Axrik.
Я так и понял, только несколько "размыто" для новичков доносите .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.10.2012, 23:21   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Во-втором случае, вычисляется значение типа float или double (смотря как объялена переменная, которой присваивается результат)
и совсем не поэтому. 3.0/2.0 даст тип double. 3.0f/2.0f даст тип float. переменная, к которой присваивается результат может быть объявлена как угодно, хоть char, просто к ней неявно приведется полученный результат (если неявное приведение возможно).
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.10.2012, 23:53   #10
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

На практике у меня выходил именно тип int. А вообще спасибо, ценная информация)
Axrik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выдает неверное число ZoomHz Общие вопросы C/C++ 2 07.03.2012 17:26
Неверное определение размера файла? _SERGEYX_ Свободное общение 2 17.11.2010 13:28
Неверное выполнение программы вычисления green-tree Помощь студентам 2 20.08.2010 09:40