Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Abendstern
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
#1

Почему sqrt требует тип double? - C++

04.12.2011, 16:22. Просмотров 748. Ответов 4
Метки нет (Все метки)

Здравствуйте. Заметил, что в VS 2008 при вызове некоторых математических функций, в частности sqrt, требуется явно приводить тип к double. Допустим:

C++
1
2
3
int x = 16;
sqrt(x); // ошибка, несоответствие типов
sqrt(static_cast<double>(x)); // нормально
Почему не происходит неявное преобразование? Как в случае с какой-нибудь пользовательской функцией, типа

C++
1
double foo(double x);
Ей вот можно замечательно передать аргументы целых типов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2011, 16:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему sqrt требует тип double? (C++):

Почему функцию sqrt нельзя применять к int переменным, а только к double и flot?
Почему функцию sqrt нельзя применять к int переменным, а только к double и...

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

Сколько Знаков после запятой имеет тип double и почему при выводе они отбрасываются
Здравствуйте! Написал функцию по расчету квадратного корня от числа. ...

Почему мы пишем double x (double y)? а не через запятую double x,y
почему мы пишем double x (double y)? а не через запятую double x,y

Sqrt(double)
Не могу понять, что это значит: double dist, sqrt(double); Понятно, что это...

Что означает sqrt(double);
Cоздали структуру struct{ int x; int y; }pt; //Чтобы вычислить...

4
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
04.12.2011, 16:26 #2
Потому что sqrt может принимать float, double, long double. Ты передаешь функции целочисленное значение. Откуда компилятору знать, к какому именно из трех типов (float, double, long double) ему сделать привести переданное значение? Пример с произвольной перегруженной функцией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo(double)
{
}
 
void foo(float)
{
}
 
int main()
{
    foo(3);
}
Впролне очевидно, что мы получим ошибку при компиляции:
Код
-*- mode: compilation; default-directory: "/home/nameless/samples/cpp/" -*-
Compilation started at Sun Dec  4 22:28:00

make -j8
g++ -c -Wall -g -std=c++0x  main.cc
main.cc: In function ‘int main()’:
main.cc:11:10: error: call of overloaded ‘foo(int)’ is ambiguous
main.cc:11:10: note: candidates are:
main.cc:1:6: note: void foo(double)
main.cc:5:6: note: void foo(float)
make: *** [main.o] Error 1

Compilation exited abnormally with code 2 at Sun Dec  4 22:28:00
все потому, что компилятор не знает, какую из функций вызвать в данном случае
1
Abendstern
3 / 3 / 2
Регистрация: 06.11.2011
Сообщений: 38
04.12.2011, 16:35  [ТС] #3
Точно, ведь в ошибке-то именно о неоднозначном вызове говорилось. Спасибо, теперь понял.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
04.12.2011, 16:48 #4
А что она считает? Квадратный корень? Или квадрат?
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
04.12.2011, 16:50 #5
taras atavin, корень
0
04.12.2011, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2011, 16:50
Привет! Вот еще темы с решениями:

Цикл: Для числа N вычислить значение следующего выражения: sqrt((1) + sqrt((2) + ... + sqrt(2 * N)))
Как это решить? sqrt((1)+sqrt((2)+..+sqrt(2n)))

Вычислить значение выражения sqrt (2 + sqrt (2 + sqrt (2 ... sqrt2))), (n-слагаемых)
Вычислить значение выражения sqrt (2 + sqrt (2 + sqrt (2 ... sqrt2))),...

Почему перестает работать программа при замене double на long double?
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел...

Как сконвертировать свой тип в тип double?
Можно ли конвертировать свой тип в тип doble? Если да, то каким способом?


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

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

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