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

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

04.12.2011, 16:22. Просмотров 765. Ответов 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 нельзя применять к 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); Понятно, что это...

4
Nameless One
Эксперт С++
5786 / 3435 / 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 / 1766 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
04.12.2011, 16:48 4
А что она считает? Квадратный корень? Или квадрат?
0
Nameless One
Эксперт С++
5786 / 3435 / 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

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

Цикл: Для числа 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))),...


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

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

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