плавать, чтобы удвоить неправильное толкование ??? г ++

по какой-то причине я получаю следующее предупреждение

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 };

2

Решение

Вам нужно использовать станд :: грех а также СТД :: соз на месте 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 библиотека функции были в глобальном пространстве имен, вы бы получили версию соз а также грех это только занимает двойной что соответствует поведению, которое мы наблюдаем.

3

Другие решения

Похоже, вы используете C-версию греха / COS. Трудно сказать, почему без дополнительной информации, но исправить можно было бы использовать функции C sinf / cosf или убедиться, что функции C ++ используются std :: sin (), например.

1

Компилятор жалуется, что вы используете 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;
}
0

cos а также sin в cmath библиотека принимает в качестве параметра double Предупреждение пытается сказать вам, что вы даете ему float и он должен будет преобразовать его в double

std версия функций перегружена, но если вы хотите их использовать, вам придется вызывать их с их пространством имен, например, так std::cos

0
По вопросам рекламы [email protected]