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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
#1

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

14.04.2014, 22:27. Просмотров 316. Ответов 11
Метки нет (Все метки)

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

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing - C++
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

Чем отличаются float преобразования (float)var от float(var) - C++
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

invalid types `float[float]' for array subscript - C++
void SEARCH(float vol, float price, int i) { if (i&gt;N) { if(price&gt;maxprice) { ...

неверное приведение void* к *float а далее к float - C++
Почему когда привожу void* к int* потом к int то все работает, данные не бьются и работают нормально, когда делаю те же операции но с...

cannot convert `float' to `float*. Почему так происходит? - C++
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра надо сдать уже #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

Ошибка cannot convert 'float' to 'float*' - C++
Здравствуйте, что означает error: cannot convert 'float' to 'float*' for argument '1' to 'int mas_time(float*, int)'? Из-за чего она...

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

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

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

Константа "1" - целая, "1.0" - вещественная
0
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
15.04.2014, 19:58  [ТС] #10
Хорошо, а если априори, все константы целочисленные, но результат дробный, например:
C++
1
2
3
4
5
int a = 1;
int b = 3;
float c;
c = a/b;
cout << fixed << setprecision(3) << c;
Результат - 0, как-то совсем не весело...
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.04.2014, 20:21 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Denque, тип результата определяется аргументами (a,b), а не типом переменной, которой это всё присваивается. Результат будет целочисленный, и он потом преобразуется к типу переменной (c). Но в итоге, как вы видите, все равно ноль, а не 0.33333(3). Чтобы получить ожидаемый результат надо изменить тип аргумента(ов). Например через static_cast или домножением на 1.0.
1
Evg
Эксперт CАвтор FAQ
17823 / 6033 / 388
Регистрация: 30.03.2009
Сообщений: 16,563
Записей в блоге: 26
15.04.2014, 20:33 #12
Цитата Сообщение от Denque Посмотреть сообщение
c = a/b;
Правая часть - выражение, которое нужно присвоить в c. Чтобы что-то присвоить, надо сначала выражение вычислить. Т.е. сначала вычисляется выражение "a/b", которое является целочисленным делением (т.к. оба аргумента целочисленны), и только потом выполяется присваивание целочисленной величины в плавающую переменную. В этом месте в правой части присваивания неявно возникает второе выражение - приведение целочисленной величины к вещественной. Т.е. для "c = a/b" выполняются три действия: целочисленное деление, приведение типа целочисленный -> вещественный, присваивание вещественной величины
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2014, 20:33
Привет! Вот еще темы с ответами:

ОШИБКА [Error] cannot convert 'int*' to 'float*' for argument '1' to 'void Syma(float*,int*,int) - C++
Какая то проблема с указателями,незнаю,не хочет щитать суму парних чисел в второй подпрограме.Извиниет за ошибки.Не владею руским.Помогите...

"Значение типа float* нельзя использовать для инициализации сущности типа float" - C++
#include &lt;math.h&gt; #include&lt;iostream&gt; #include &lt;iomanip&gt; #include&lt;conio.h&gt; using namespace std; ...

непонятка - C++
на парах нам учитель дает зделаную прогу как пример (скорей всего на студия-08) и в компютерном класе оно все работает (там тоже студия...

Непонятка с указателями - C++
Как так что если указатель на int он покажет свой адрес а на char покажет символ свой. int * pointerInt = new int; char *...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.04.2014, 20:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru