Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 07.11.2019
Сообщений: 9
1

Зачем нужно приводить к double

08.12.2019, 19:43. Показов 2198. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C
1
printf("%f",(double)summa/vsego);
Как объяснить double в этом случае?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2019, 19:43
Ответы с готовыми решениями:

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std;...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include <iostream> #include <cmath> using namespace std; double Akk(double x, double y, double...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это...

Зачем нужно u--?
Как я понимаю это счетчик итераций !! но зачем он ?? #include <iostream> #include <stdio.h>...

19
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
08.12.2019, 19:57 2
Это тоже самое что и double()
Оно трансформировало выражение int / int в double / int
Благодаря перегрузке функций выражение int / int вернуло бы целое, без остатка
Но double / int вернёт дробное значение
(double)summa / vsego - устаревший вид
Чаще можно увидеть
double(summa) / vsego
1
0 / 0 / 0
Регистрация: 07.11.2019
Сообщений: 9
17.12.2019, 15:57  [ТС] 3
Спасибо!
0
3882 / 2480 / 418
Регистрация: 09.09.2017
Сообщений: 10,891
18.12.2019, 10:22 4
Цитата Сообщение от AndryS1 Посмотреть сообщение
(double)summa / vsego - устаревший вид
Чаще можно увидеть
double(summa) / vsego
Не берусь утверждать наверняка, но вроде бы (double)x это Си-стиль явного приведения, а double(x) - плюсовый. Причем визуально второй вариант похож вообще на конструктор объекта.
1
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.12.2019, 10:29 5
Цитата Сообщение от Nik_121 Посмотреть сообщение
Как объяснить double в этом случае?
Распространенные ошибки

Цитата Сообщение от AndryS1 Посмотреть сообщение
Чаще можно увидеть
double(summa) / vsego
В Си++ - да. В Си - нет
2
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
18.12.2019, 20:27 6
Цитата Сообщение от Evg Посмотреть сообщение
В Си++ - да. В Си - нет
А что Си++ используют не чаще чем Си?)
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
18.12.2019, 23:01 7
Цитата Сообщение от AndryS1 Посмотреть сообщение
А что Си++ используют не чаще чем Си?)
Раздел, в котором размещена данная тема, называется "Си", а не "Си++"
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,077
18.12.2019, 23:33 8
Цитата Сообщение от Nik_121 Посмотреть сообщение
Как объяснить double в этом случае?
Никак. Без точной информации о типе summa и vsego ваш вопрос полностью бессмыслен.

Цитата Сообщение от AndryS1 Посмотреть сообщение
Это тоже самое что и double()
Что такое double()???

Цитата Сообщение от AndryS1 Посмотреть сообщение
Оно трансформировало выражение int / int
Откуда вы знаете, что это int / int?
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
19.12.2019, 09:51 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Без точной информации о типе summa и vsego ваш вопрос полностью бессмыслен
Строго говоря, есть ещё и статистика по вопросам от начинающих. Поэтому конкретно в данном случае можно смело ванговать на тему того, что переменные summa и vsego имеют целочисленный тип
0
3882 / 2480 / 418
Регистрация: 09.09.2017
Сообщений: 10,891
19.12.2019, 10:03 10
А можно зайти и с другой стороны: поскольку приведение не упало с ошибкой, тип данных числовой. А раз оно вообще понадобилось, он был целочисленным.
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,077
19.12.2019, 10:18 11
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А раз оно вообще понадобилось, он был целочисленным.
Нет, конечно. Приведение запросто может понадобиться и для float / float.

Цитата Сообщение от Evg Посмотреть сообщение
Строго говоря, есть ещё и статистика по вопросам от начинающих. Поэтому конкретно в данном случае можно смело ванговать...
В том то и дело, что можно, но не нужно. Это не вопрос "вангования" на тему того, что хотел спросить начинающий. Это вопрос обучения начинающих умению правильно задавать вопросы. В этом, кстати, содержится 90% ответа.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
19.12.2019, 10:29 12
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это вопрос обучения начинающих умению правильно задавать вопросы. В этом, кстати, содержится 90% ответа
Есть такие начинающие, которым действительно интересно программирование. А есть такие, которым просто нужно спихнуть зачёт. По постановке вопроса их можно отличить. Тратить время на обучение начинающих имеет смысл только тогда, когда начинающему это действительно нужно

Другое дело, что независимо от того, что из себя представляет ТС, тему будут читать в том числе и те, кто является начинающим и кто готов тратить время на обучение. Вот здесь с тобой соглашусь - ради этого действительно имеет смысл потратить время
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,077
19.12.2019, 10:35 13
Цитата Сообщение от Evg Посмотреть сообщение
Есть такие начинающие, которым действительно интересно программирование. А есть такие, которым просто нужно спихнуть зачёт. По постановке вопроса их можно отличить.
Да, но предоставлять ответы, ориентированные именно на желающих "спихнуть зачёт" - лишь замусоривать ресурс. Тем более что примерно в 99 случаях из 100 ответы этим желающим уже много раз предоставлялись. Пусть не ленятся и ищут сами.

Цитата Сообщение от Evg Посмотреть сообщение
Другое дело, что независимо от того, что из себя представляет ТС, тему будут читать в том числе и те, кто является начинающим и кто готов тратить время на обучение. Вот здесь с тобой соглашусь - ради этого действительно имеет смысл потратить время
Именно. В современном интернет-сообществе акцент уже давно сдвинулся с предоставления ответа непосредственному вопрошавшему на обсуждение темы со всеми присутствующими и предоставление ответа тем, кто придет позже. И это правильно.
0
3882 / 2480 / 418
Регистрация: 09.09.2017
Сообщений: 10,891
20.12.2019, 09:59 14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Приведение запросто может понадобиться и для float / float.
Разумеется нет. Во-первых, вывод идет все равно с форматом "%f", во-вторых, функции с переменным числом параметров сами приводят типы. Единственный вариант - слабая попытка повысить точность, но и то спохватываться последнем этапе бессмысленно.
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,077
20.12.2019, 10:46 15
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Разумеется нет. Во-первых, вывод идет все равно с форматом "%f", во-вторых, функции с переменным числом параметров сами приводят типы.
При чем здесь все это вообще?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Единственный вариант - слабая попытка повысить точность
Именно об этом идет речь. Ничего "слабого" в повышении точности с float до double, разумеется, нет. Это громадное повышение точности.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
но и то спохватываться последнем этапе бессмысленно.
Смешно.

Это примерно то же самое, как на популярный вопрос начинающих о том, почему 1/2 дает 0, ответить "Чувак, можно, конечно, выполнить плавающее деление, но спохватываться на последнем этапе бессмысленно. 0 значит 0. Привыкай."
0
3882 / 2480 / 418
Регистрация: 09.09.2017
Сообщений: 10,891
20.12.2019, 12:28 16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
При чем здесь все это вообще?
При том, что конвертация float->double при передаче в printf происходит автоматически, без явного указания.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Именно об этом идет речь. Ничего "слабого" в повышении точности с float до double, разумеется, нет. Это громадное повышение точности.
Громадным оно было бы если бы все расчеты изначально велись в double. А так говорить о повышении точности просто смешно.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это примерно то же самое, как на популярный вопрос начинающих о том, почему 1/2 дает 0, ответить "Чувак, можно, конечно, выполнить плавающее деление, но спохватываться на последнем этапе бессмысленно. 0 значит 0. Привыкай."
О, мастер кривых аналогий в действии! Давай, чем еще повеселишь?
0
TheCalligrapher
20.12.2019, 19:21
  #17

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
При том, что конвертация float->double при передаче в printf происходит автоматически, без явного указания.
Хм... А сумма углов треугольника - 180 градусов. Просто удивленно переглянемся и покачаем головами...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Громадным оно было бы если бы все расчеты изначально велись в double. А так говорить о повышении точности просто смешно.[...]О, мастер кривых аналогий в действии! Давай, чем еще повеселишь?
Я вижу, что "кривая аналогия" звонко попала в самую точку. Это называется "когда понял, что сел в лужу, и нечем крыть" :)

0
3882 / 2480 / 418
Регистрация: 09.09.2017
Сообщений: 10,891
21.12.2019, 11:12 18
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я вижу, что "кривая аналогия" звонко попала в самую точку. Это называется "когда понял, что сел в лужу, и нечем крыть"
Не вижу смысла особо комментировать высказывания человека, который не видит разницы int->float и float->double. Тем более в операции деления, где потери точности дробных чисел минимальны.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Хм... А сумма углов треугольника - 180 градусов.
А, так ты просто не понял простейшую цепочку рассуждений. Хорошо, объясню.
В 14 посте было сделано два предположения зачем можно пытаться привести float к double при передаче функции printf: явно указать выводимый тип (независимо от реальной точности), либо повысить точность при операции деления.
Опровергаем первый вариант: при передаче дробных чисел в функцию с переменным числом аргументов происходит неявное преобразование до double.
Опровергаем второй вариант: операции умножения и деления для дробных чисел гораздо меньше влияют на точность, чем операции сложения*. Мало того, при выводе редко учитывается больше 2-4 значащих цифр. На практике это просто не нужно.
Так что TheCalligrapher, хватит уже портить воздух и спорить на пустом месте, тем более когда и спор-то не нужен: твои высказывания никто не оспаривал, пока ты сам не полез позориться. Ну тут уж кто еще тебе виноват.
--
*) Для новичков (TheCalligrapher'у -то это не поможет, он целые числа от дробных не отличает): дробные числа в памяти машины хранятся в формате m+2e. Для операций сложения (в т.ч. вычитания) двух чисел приходится приводить их степени к одному значению, то есть сдвигать значащие цифры вправо. Те биты, которые были младшими, приходится отбросить. По этой причине сложение дробных чисел приводит к значительному снижению точности. А вот при умножении и делении это не требуется: степени просто складываются или вычитаются отдельно от значащих цифр.
С целыми числами ситуация другая. В них хранятся только значащие цифры, никакие степеней. Соответственно, сложение и вычитание выполняются без всяких сдвигов, то есть без потери точности (если не допускать переполнения, конечно). Умножение целого на целое тоже обходится без потери точности. А вот с делением хуже, причем просто потому что числа целые и хранить дробную часть не умеют.
0
2306 / 1132 / 702
Регистрация: 25.04.2016
Сообщений: 3,228
21.12.2019, 14:40 19
Nik_121, и правда, зачем?
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main (void) {
    int summa = 5;
    int vsego = 2;
    printf("avg = %lf\n", summa/vsego);
    printf("avg = %lf\n", (double)summa/vsego);
    return 0;
}
Добавлено через 1 минуту
AndryS1, в си нет перегрузок функций. Да и формат %f ожидает float, а не double.
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,077
22.12.2019, 07:11 20
Цитата Сообщение от stake-k26 Посмотреть сообщение
Да и формат %f ожидает float, а не double.
В функции printf форматы %f и %lf эквивалентны и оба ожидают double. Функция printf не может ожидать float потому, что значения типа float невозможно передать через variadic параметры.

Использовать %f для float аргументов, а %lf для double аргументов - хороший тон, но это не обязательно.
0
22.12.2019, 07:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2019, 07:11
Помогаю со студенческими работами здесь

Зачем в методе простой итерации (линейные системы) приводить к диагональному преобладанию ?
метод простой итерации решения систем линейных уравнений. зачем приводить к диагональному...

Зачем в .NET в 2014 г. строгая типизация? Зачем нужно писать Convert.ToInt32(), ToString(), Int32.Parse()?
По поводу преобразования. Современный препроцессор кода сам определяет, что куда преобразовывать....

Ругается на строчку double[] wArray = new double[n];, double[] w = new double[n];
Ругается на строчку double wArray = new double;, double w = new double; Не удаётся преобразовать...

Зачем нужно ООП?
В общем, столкнулся с такой проблемой (пока только постигаю азы программирования в с++), я не...


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

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