漂浮到双重误解???克++

时间:2013-10-01 18:47:33

标签: c++ types casting g++ narrowing

由于某种原因,我收到了以下警告

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

4 个答案:

答案 0 :(得分:3)

您需要使用std::sinstd::cos代替sincos,以便获得正确重载的版本。您可以看到差异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 behaviorcos的版本,只需 double < / em>这与我们看到的行为一致。

答案 1 :(得分:1)

看起来你正在使用罪恶/ cos的C版。很难说没有其他信息的原因,但修复可能是使用C函数sinf / cosf或确保例如std :: sin()使用C ++函数。

答案 2 :(得分:0)

cos库中的sincmath接受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;
}