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

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

Восстановить пароль Регистрация
 
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
04.12.2011, 16:22     Почему sqrt требует тип double? #1
Здравствуйте. Заметил, что в VS 2008 при вызове некоторых математических функций, в частности sqrt, требуется явно приводить тип к double. Допустим:

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

C++
1
double foo(double x);
Ей вот можно замечательно передать аргументы целых типов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.12.2011, 16:26     Почему sqrt требует тип double? #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
все потому, что компилятор не знает, какую из функций вызвать в данном случае
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
04.12.2011, 16:35  [ТС]     Почему sqrt требует тип double? #3
Точно, ведь в ошибке-то именно о неоднозначном вызове говорилось. Спасибо, теперь понял.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2011, 16:48     Почему sqrt требует тип double? #4
А что она считает? Квадратный корень? Или квадрат?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.12.2011, 16:50     Почему sqrt требует тип double? #5
taras atavin, корень
Yandex
Объявления
04.12.2011, 16:50     Почему sqrt требует тип double?
Ответ Создать тему
Опции темы

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