20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
1

Не могу понять, что неправильно с float

03.02.2016, 04:29. Показов 2060. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствия. Прошу прощения за глупый вопрос, но споткнулся на ровном, и не могу понять, что не так.
C++
1
2
3
4
5
    int vsego = 282;
    int obnol = 19;
    float itog;
    itog = obnol / vsego;
    cout << itog << endl;
В консоли появляется 0.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2016, 04:29
Ответы с готовыми решениями:

Строки в С++, не могу понять что неправильно в программе
Необходимо: 1) Найти количество слов в строке, 2) вывестии все слова в порядке возрастания длинн, ...

Не могу понять, почему программа неправильно работает!
Изучаю С++ по Страуструпу Б. - Программирование. Принципы и практика использования C++. Есть...

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

не могу понять что не так
задание такое : Структура &quot;книга почтой&quot;:-наименование книги;-ФИО автора;-номер по...

21
Модератор
Эксперт JS
5197 / 2079 / 406
Регистрация: 06.01.2013
Сообщений: 4,793
03.02.2016, 05:17 2
C++
1
itog = (float) obnol / vsego
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
03.02.2016, 08:37 3
Цитата Сообщение от FraidZZ Посмотреть сообщение
itog = (float) obnol / vsego
itog = obnol / (float)vsego
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
03.02.2016, 08:40 4
gogaloh, правильный ответ уже написали выше. А я хотел бы посоветовать не пользоваться типом float и думаю, что многие меня поддержат. Для вещественных чисел лучше использовать double.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
03.02.2016, 08:51 5
Kerry_Jr, зависит от многих условий и целей. На x64-86 не стоит, если только это не узкое место, да и тогда не факт, что имеет смысл. На 16-битных ARM или для хранения огромных массивов с низкой точностью - почему бы и нет.

Но свой кошелёк float'у я бы всё-таки не доверил.
1
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
03.02.2016, 09:12  [ТС] 6
Люди добрые, вообще-то мне нужен не только правильный ответ, но и ссылка, где бы я узнал почему мой вариант не работал. И еще пользуясь Вашей добротой хочется узнать, как уменьшить количество цифр после точки.
Мне достаточно одной или двух цифр.(укажите где об этом узнать)
Храни вас Бог.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
03.02.2016, 09:30 7
gogaloh, ваш вариант неверен, так как у вас две целочисленные переменные, которые вы делите одну на другую. А при целочисленном делении результат тоже целое число. А так как вы делите большее на меньшее, то получается значение меньше единицы, т.е. 0. А чтобы результат был дробным, нужно, чтобы хотя бы одна из переменных была дробным числом.
Цитата Сообщение от gogaloh Посмотреть сообщение
Мне достаточно одной или двух цифр.(укажите где об этом узнать)
Для этого можно воспользоваться методом precision
C++
1
2
cout.precision(2);
cout << itog << endl;
Либо подключить заголовок <iomanip> и написать так
C++
1
cout << setprecision(2) << itog << endl;
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
03.02.2016, 09:36  [ТС] 8
Kerry_Jr, повторюсь, добрее Ваших глаз я не встречал.
0
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
03.02.2016, 09:46 9
Цитата Сообщение от gogaloh Посмотреть сообщение
но и ссылка, где бы я узнал почему мой вариант не работал.
http://www.c-cpp.ru/books/preo... razheniyah
Фишка в том, что тип выражения считается по первому операнду. Далее уже оптимизатор решает что напрягать ЦПУ или сопроцессор для вещественных. Поэтому если ты хочешь получить целочисленное деление - первый операнд нужно делать целым, иначе вещественным.
Для этого и пишут либо как выше либо так:
C++
1
itog = 1.0*obnol / vsego
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
03.02.2016, 10:03 10
Цитата Сообщение от Hikari Посмотреть сообщение
тип выражения считается по первому операнду
Это где такое написано?

Добавлено через 1 минуту
А вот цитата из ссылки, которую вы дали
Цитата Сообщение от Цитата
Компилятор преобразует все операнды «вверх», к типу большего операнда
1
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
03.02.2016, 10:21 11
Цитата Сообщение от Hikari Посмотреть сообщение
тип выражения считается по первому операнду
Неа:
C++
float f = 1/3.;
cout << f;
1
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
03.02.2016, 11:20 12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Неа:
В дебри компиляторов я лезть не стану. Скажу лишь что всегда выходила из таких ситуаций именно точным определением типа как раз первого операнда. Иначе получала не то что ожидалось.
Права я или нет лично мне не особо важно, потому что пути компилятора неисповедимы.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
03.02.2016, 11:29 13
Цитата Сообщение от Hikari Посмотреть сообщение
В дебри компиляторов я лезть не стану
Какие ж это дебри? Вам предъявили в качестве аргумента, опровергающего Ваше предположение, пример из двух строчек, в котором первый операнд - целое число, а второй - с плавающей точкой. Результат будет числом с плавающей точкой (хотя Вы утверждали обратное).
Я бы даже сократил пример до одной строки:
C++
1
std::cout << 1 / 3.0;
0
2662 / 2237 / 240
Регистрация: 03.07.2012
Сообщений: 8,138
Записей в блоге: 1
03.02.2016, 11:32 14
Hikari, привести пример, когда точно определяется не первый операнд и при этом выражение считается неверно можете? Вы же в теме выше пишите не "я делаю так:... ", а "Фишка в том, что тип выражения считается по первому операнду", т.е. сообщаете новичкам ложную информацию (и переучить их потом будет проблема).
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
03.02.2016, 11:33 15
Или так:
C++
1
2
auto f = 1/3.; // какой будет тип у переменной f?
std::cout << f;
0
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
03.02.2016, 11:45 16
Цитата Сообщение от zer0mail Посмотреть сообщение
т.е. сообщаете новичкам ложную информацию
Думай что хочешь
Я не намерена свои взгляды навязывать кому-то.
Ложная так ложная. Для меня это уж лет 10 как истина, а мнение других мне мало важно.
Пусть gogaloh скажет тебе "спасибо" за ретивость, я не против.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
03.02.2016, 11:53 17
Цитата Сообщение от Hikari Посмотреть сообщение
Для меня это уж лет 10 как истина, а мнение других мне мало важно.
Пусть gogaloh скажет тебе "спасибо" за ретивость
Зря Вы так. Умение принимать адекватную критику (признавать и исправлять свои ошибки) очень важно не только в работе программиста. Почитайте авторитетные источники по C++ (стандарт, Страуструп) и Вы увидите, что ребята дело говорят.
Ваша позиция по данному вопросу ошибочна. Ничего постыдного в этом нет - humanum errare est.
3
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.02.2016, 11:57 18
Цитата Сообщение от Hikari Посмотреть сообщение
Для меня это уж лет 10 как истина
За десять лет можно было узнать правила преобразований
5. Expressions
...
9. Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result.
This pattern is called the usual arithmetic conversions, which are defined as follows:
— If either operand is of scoped enumeration type (7.2), no conversions are performed; if the other operand does not have the same type, the expression is ill-formed.
— If either operand is of type long double, the other shall be converted to long double.
— Otherwise, if either operand is double, the other shall be converted to double.
— Otherwise, if either operand is float, the other shall be converted to float.
— Otherwise, the integral promotions (4.5) shall be performed on both operands. Then the following rules shall be applied to the promoted operands:
—— If both operands have the same type, no further conversion is needed.
—— Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank shall be converted to the type of the operand with greater rank.
—— Otherwise, if the operand that has unsigned integer type has rank greater than or equal to the rank of the type of the other operand, the operand with signed integer type shall be converted to the type of the operand with unsigned integer type.
—— Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, the operand with unsigned integer type shall be converted to the type of the operand with signed integer type.
—— Otherwise, both operands shall be converted to the unsigned integer type corresponding to the type of the operand with signed integer type.
2
2662 / 2237 / 240
Регистрация: 03.07.2012
Сообщений: 8,138
Записей в блоге: 1
03.02.2016, 12:09 19
Цитата Сообщение от Hikari Посмотреть сообщение
Я не намерена свои взгляды навязывать кому-то.
Так не навязывай: просто вместо "фишка в том, что.." пиши "я делаю так:..". Ходить за тобой и исправлять твои ошибочные высказывания никому не интересно. Новички идут на форум за знаниями , а не за заблужениями. Не уверена - не пиши.
И еще: по схеме из твоей ссылки получается, что float+int будет double, а мой компилятор DevC++ думает по-другому: у него получается float.
1
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
03.02.2016, 12:24 20
Цитата Сообщение от Croessmah Посмотреть сообщение
За десять лет можно было узнать правила преобразований
Я не пишу на Си так часто, чтоб вникать в подробности.
Цитата Сообщение от zer0mail Посмотреть сообщение
Не уверена - не пиши.
Все все, успакойся. Иди сьешь мармаладку - ты победитель
Вот уж действительно правду говорят, что ИТшника можно с полпинка раззадорить до состояния Виндизеля во время гонок
Расслабься - я признаю свою неправоту, раз уж ты так хочешь себя почувствовать серьезным мэном
0
03.02.2016, 12:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2016, 12:24
Помогаю со студенческими работами здесь

не могу понять что с выводом
помогите найти косяк,у меня при отрицательном &quot;a&quot; он выдаёт результат и &quot;error&quot; хотя должен только...

не могу понять что не так(((((
привет всем! у меня проблемка возникла компиятор никак не проглатывает мой код #include &lt;iostream&gt;...

Не могу что-то понять с указателями
Объясните мне,пожалуйста, почему когда я пишу так: void main() { char arr=&quot;erbb45&quot;; char...

что не верно? не могу понять.
программа должна оборачивать каждое слово в предложении. (например &quot;пришел&quot;, а выведет &quot;леширп&quot;)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru