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

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

Войти
Регистрация
Восстановить пароль
 
Abendstern
3 / 3 / 0
Регистрация: 06.11.2011
Сообщений: 38
#1

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

04.12.2011, 16:22. Просмотров 680. Ответов 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);
Ей вот можно замечательно передать аргументы целых типов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2011, 16:22     Почему sqrt требует тип double?
Посмотрите здесь:
Почему функцию sqrt нельзя применять к int переменным, а только к double и flot? C++
C++ Sqrt(double)
C++ Вычислить значение выражения sqrt (2 + sqrt (2 + sqrt (2 ... sqrt2))), (n-слагаемых)
Не могу преобразовать тип char в тип double C++
Как сконвертировать свой тип в тип double? C++
C++ Рекурсия: вычислить значение выражения sqrt(1+sqrt(2+...sqrt(n)))
Дано натуральное число n. Вычислить sqrt(2+ sqrt(5 + sqrt(7...)) C++
Рекурсия: вычисление sqrt(1 + sqrt(2 + ... + sqrt(n))) C++
Почему не требует заголовочные файлы? C++
C++ Точность.Тип double
C++ Тип double, ввод
Почему не работает sqrt? Подскажите, где ошибка? Простенькая программа с тремя функциями C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2011, 16:48     Почему sqrt требует тип double? #4
А что она считает? Квадратный корень? Или квадрат?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
04.12.2011, 16:50     Почему sqrt требует тип double? #5
taras atavin, корень
Yandex
Объявления
04.12.2011, 16:50     Почему sqrt требует тип double?
Ответ Создать тему
Опции темы

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