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 };
答案 0 :(得分:3)
您需要使用std::sin和std::cos代替sin
和cos
,以便获得正确重载的版本。您可以看到差异live:
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
标题段落<{3}} em> 4 说(强调我的):
除第18条至第30条和附件D中所述外,每个标题cname的内容应与C标准库(1.2)或C Unicode TR中指定的相应标题名称h的内容相同。酌情包括在内。但是,在C ++标准库中,声明(除了在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.6)内。 未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式using-declarations注入命名空间std (7.3.3)。
因此,如果 C库函数位于全局命名空间中,您将获得unspecified behavior和cos的版本,只需 double < / em>这与我们看到的行为一致。
答案 1 :(得分:1)
看起来你正在使用罪恶/ cos的C版。很难说没有其他信息的原因,但修复可能是使用C函数sinf / cosf或确保例如std :: sin()使用C ++函数。
答案 2 :(得分:0)
cos
库中的sin
和cmath
接受double作为参数。该警告试图告诉您,您正在为其提供float
,并且必须将其转换为double
std
版本的函数已经过载,但是如果你想使用它们,你必须使用它们的命名空间来调用它们,如std::cos
答案 3 :(得分:0)
编译器抱怨你正在使用一个期望加倍的浮点数。您可以显式地转换每个用法,也可以只创建一个本地双。
我会按如下方式重写你的例子:
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;
}