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

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

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

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

04.12.2011, 16:22. Просмотров 686. Ответов 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? - C++
Почему функцию sqrt нельзя применять к int переменным, а только к double и float? Извините за опечатку в названии темы.

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

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

Sqrt(double) - C++
Не могу понять, что это значит: double dist, sqrt(double); Понятно, что это объявление переменных, но зачем дабл в скобках?

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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 / 0
Регистрация: 06.11.2011
Сообщений: 38
04.12.2011, 16:35  [ТС] #3
Точно, ведь в ошибке-то именно о неоднозначном вызове говорилось. Спасибо, теперь понял.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.12.2011, 16:48 #4
А что она считает? Квадратный корень? Или квадрат?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
04.12.2011, 16:50 #5
taras atavin, корень
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2011, 16:50
Привет! Вот еще темы с ответами:

Вычислить значение выражения sqrt (2 + sqrt (2 + sqrt (2 ... sqrt2))), (n-слагаемых) - C++
Вычислить значение выражения sqrt (2 + sqrt (2 + sqrt (2 ... sqrt2))), (n-слагаемых),с помощью iostream, stdio.С помощью цикла for або while

Не могу преобразовать тип char в тип double - C++
Вся загвоздка в str1 и str2; #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include&quot;stdlib.h&quot; #include &quot;cstdlib&quot; #include &lt;iostream&gt; ...

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

Дано натуральное число n. Вычислить sqrt(2+ sqrt(5 + sqrt(7...)) - C++
Дано натуральное число n.Вычислить sqrt(2+ sqrt(5 + sqrt(7...)). Под корнями располагается n первых простых чисел. Написал как находить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.12.2011, 16:50
Ответ Создать тему
Опции темы

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