Форум программистов, компьютерный форум CyberForum.ru

Непонятка с float - C++

Восстановить пароль Регистрация
 
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
14.04.2014, 22:27     Непонятка с float #1
float s = (123 * 100 / 360000);
cout << fixed << setprecision(3) << s;
По идее, в консоли должно вывести "0,034", но видимо с++ не разделяет эту идею.
Пробовал и в отладчике переменную смотреть и разные среды(Code Blocks, MVS 2008).
Всё равно в консоли "0". Я просто смеюсь и плачу, что такая ерунда не получается...
Ах, да, double тоже пробовал.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2014, 22:27     Непонятка с float
Посмотрите здесь:

C++ Ошибка cannot convert 'float' to 'float*'
fstream непонятка C++
C++ непонятка
C++ Непонятка с указателями
invalid types `float[float]' for array subscript C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
14.04.2014, 22:28     Непонятка с float #2
float s = (123. * 100 / 360000);
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
14.04.2014, 22:33  [ТС]     Непонятка с float #3
А вы не могли бы пояснить, пожалуйста?
IrineK
Заблокирован
14.04.2014, 22:37     Непонятка с float #4
Все числа 120 100 360000 являются целыми. Поэтому результат действий над ними также будет целым числом.
Только затем полученное целое присваивается float.

Число 123. целым не является. Этого достаточно, чтобы весь результат также не был целым.
Кстати, он будет double. Поэтому приводить его к float - терять точность.

С таким успехом точку можно было поставить после 100 или после 360000.
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
14.04.2014, 22:48  [ТС]     Непонятка с float #5
А если вместо чисел в выражении переменные?
IrineK
Заблокирован
14.04.2014, 23:03     Непонятка с float #6
Программирование - наука экспериментальная )
Напишите
float a = 123;
float s = (a * 100 / 360000);
И посмотрите, чего выйдет.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.04.2014, 13:31     Непонятка с float #7
IrineK, на одних экспериментах базироваться нельзя. Не будешь же проверять всё множество доступных компиляторов. Нужно и к стандарту обращаться (теории) чтобы не было потом "в gcc работает, а в vs - нет" и наоборот.
IrineK
Заблокирован
15.04.2014, 13:57     Непонятка с float #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Не будешь же проверять всё множество доступных компиляторов.
Ой, нет.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
15.04.2014, 18:38     Непонятка с float #9
Цитата Сообщение от Denque Посмотреть сообщение
А если вместо чисел в выражении переменные?
Никакой роли не играет. Если у тебя аргументы являются целочисленными (будь то константа или переменная), то оперция построится целочисленная.

Константа "1" - целая, "1.0" - вещественная
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
15.04.2014, 19:58  [ТС]     Непонятка с float #10
Хорошо, а если априори, все константы целочисленные, но результат дробный, например:
C++
1
2
3
4
5
int a = 1;
int b = 3;
float c;
c = a/b;
cout << fixed << setprecision(3) << c;
Результат - 0, как-то совсем не весело...
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.04.2014, 20:21     Непонятка с float #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Denque, тип результата определяется аргументами (a,b), а не типом переменной, которой это всё присваивается. Результат будет целочисленный, и он потом преобразуется к типу переменной (c). Но в итоге, как вы видите, все равно ноль, а не 0.33333(3). Чтобы получить ожидаемый результат надо изменить тип аргумента(ов). Например через static_cast или домножением на 1.0.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2014, 20:33     Непонятка с float
Еще ссылки по теме:

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing C++
cannot convert `float' to `float*. Почему так происходит? C++
C++ Чем отличаются float преобразования (float)var от float(var)

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
15.04.2014, 20:33     Непонятка с float #12
Цитата Сообщение от Denque Посмотреть сообщение
c = a/b;
Правая часть - выражение, которое нужно присвоить в c. Чтобы что-то присвоить, надо сначала выражение вычислить. Т.е. сначала вычисляется выражение "a/b", которое является целочисленным делением (т.к. оба аргумента целочисленны), и только потом выполяется присваивание целочисленной величины в плавающую переменную. В этом месте в правой части присваивания неявно возникает второе выражение - приведение целочисленной величины к вещественной. Т.е. для "c = a/b" выполняются три действия: целочисленное деление, приведение типа целочисленный -> вещественный, присваивание вещественной величины
Yandex
Объявления
15.04.2014, 20:33     Непонятка с float
Ответ Создать тему
Опции темы

Текущее время: 17:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru