по какой-то причине я получаю следующее предупреждение
filename.cpp:99:53: warning: narrowing conversion of ‘sin(((double)theta))’ from ‘double’ to ‘float’ inside { } [-Wnarrowing]
filename.cpp:99:66: warning: narrowing conversion of ‘cos(((double)theta))’ from ‘double’ to ‘float’ inside { } [-Wnarrowing]
это звучит так, как будто он пытается использовать ‘double cos (double)’ и т. д. вместо ‘float cos (float)’ и т. д.
Я продолжаю пытаться придумать больше способов предложить это компилятору, но никуда не денусь.
Что я могу сделать, чтобы решить эту проблему?
void foo(float theta)
{
theta = (float)M_PI*theta/180.0f;
MyClass variable = { 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, cos(theta), -sin(theta), 0.0f,
0.0f, sin(theta), cos(theta), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
bob = variable;
}
Спасибо
Редактировать:
если изменить его на это, предупреждения исчезнут, но я все равно лучше знаю, в чем проблема
float C = cos(theta), S = sin(theta);
MyClass variable = { 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, C, -S, 0.0f,
0.0f, S, C, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
Вам нужно использовать станд :: грех а также СТД :: соз на месте sin
а также cos
так что вы получите правильно перегруженные версии. Вы можете увидеть разницу жить:
MyClass variable = { 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, std::cos(theta), -std::sin(theta), 0.0f,
0.0f, std::sin(theta), std::cos(theta), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
это неуточненное поведение ли функции из C библиотеки сначала объявляются в глобальном пространстве имен в проекте стандартного раздела C ++ 17.6.1.2
Заголовки параграф 4 говорит (акцент мой):
За исключением случаев, указанных в пунктах 18–30 и Приложении D, содержимое каждого заголовка cname должно быть таким же, как и содержимое соответствующего заголовка name.h, как указано в стандартной библиотеке C (1.2) или C Unicode TR, в зависимости от случая как бы путем включения. Однако в стандартной библиотеке C ++ объявления (за исключением имен, которые определены как макросы в C) находятся в пределах пространства имен (3.3.6) пространства имен std. Не указано, были ли эти имена сначала объявлены в глобальной области пространства имен, а затем введены в пространство имен std с помощью явных объявлений using (7.3.3).
так что в случае, когда C библиотека функции были в глобальном пространстве имен, вы бы получили версию соз а также грех это только занимает двойной что соответствует поведению, которое мы наблюдаем.
Похоже, вы используете C-версию греха / COS. Трудно сказать, почему без дополнительной информации, но исправить можно было бы использовать функции C sinf / cosf или убедиться, что функции C ++ используются std :: sin (), например.
Компилятор жалуется, что вы используете float, где он ожидает удвоение. Вы можете либо явно использовать каждое использование, либо просто создать локальный дубль.
Я бы переписал ваш пример следующим образом:
void foo(float theta)
{
double rad = (double)M_PI*theta/180.0f;
MyClass variable = { 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, cos(rad), -sin(rad), 0.0f,
0.0f, sin(rad), cos(rad), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
bob = variable;
}
cos
а также sin
в cmath
библиотека принимает в качестве параметра double Предупреждение пытается сказать вам, что вы даете ему float
и он должен будет преобразовать его в double
std
версия функций перегружена, но если вы хотите их использовать, вам придется вызывать их с их пространством имен, например, так std::cos