C++ 浮动到双重误解???g++;

C++ 浮动到双重误解???g++;,c++,types,casting,g++,narrowing,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 {

出于某种原因,我得到以下警告

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

cmath
库中的
cos
sin
接受double作为参数。警告试图告诉您您正在给它一个
浮点
,它必须将其转换为
双精度


函数的
std
版本是重载的,但是如果你想使用它们,你必须用它们的名称空间调用它们,比如
std::cos

cmath
库中的
cos
sin
接受double作为参数。警告试图告诉您您正在给它一个
浮点
,它必须将其转换为
双精度


函数的
std
版本是重载的,但是如果你想使用它们,你必须用它们的名称空间调用它们,就像这样
std::cos

编译器抱怨说你使用的是浮点,而它期望的是双精度。您可以显式地强制转换每个用法,也可以只创建一个本地double

我将您的示例改写如下:

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

编译器抱怨说您使用的是一个浮点值,而它期望的是一个双精度浮点值。您可以显式地强制转换每个用法,也可以只创建一个本地double

我将您的示例改写如下:

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;
}
您需要使用并替换
sin
cos
,以便获得正确重载的版本。您可以看到不同之处:

<> P>是否C++函数库函数在全局命名空间中首次声明,C++草稿标准部分<代码> 7.61.2 头段4(强调矿):

除第18条至第30条和附录D中的说明外,每个标题cname的内容应与C标准库(1.2)或C Unicode TR(视情况而定)中规定的相应标题名称.h的内容相同,如同通过包含一样。然而,在C++标准库中,声明(除了在C中定义为宏的名称)位于命名空间STD的命名空间范围(3.3.6)之内。<强>未指定这些名称是否首先在全局命名空间范围内声明,然后通过声明使用< < /强>注入命名空间STD。(7.3.3)

因此,在C库函数位于全局名称空间的情况下,您将获得的版本是,并且只需要使用double,这与我们看到的行为一致。

您需要使用并替换
sin
cos
,以便获得正确重载的版本。您可以看到di冷漠:

<> P>是否C++函数库函数在全局命名空间中首次声明,C++草稿标准部分<代码> 7.61.2 头段4(强调矿):

除了第18至30条和附录D中所指出的,每一个头CCNED的内容应该与相应的头名称.H一样,如C标准库(1.2)或C Unicode TR中所规定的那样,只要包含在其中,在C++标准库中,声明就可以了。(C中定义为宏的名称除外)位于命名空间标准的命名空间范围(3.3.6)内。未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明注入命名空间标准。(7.3.3)


因此,在C库函数位于全局命名空间的情况下,您将获得的版本是,并且只需要两倍,这与我们看到的行为一致。

看起来您使用的是sin/cos的C verison。如果没有其他信息,很难说为什么,但修复方法可能是使用C函数sinf/cosf或确保C++函数是用STD::SN()来使用的。

< P>看起来你在使用Sun/CoS的C ValeSon。很难说为什么没有附加信息,但是FIX可以是使用C函数SIMF/COSF,或者确保C++函数被STD::S.()使用。例如。

你能使用
sinf
cosf
吗?你能使用
sinf
cosf
吗?这不是缩小转换。@OliCharlesworth是这样,但你需要像这样显式调用
std
版本
cos
,这不是缩小转换。@OliCharlesworth是true,但是您需要调用
std
version显式,就像这样
std::cos
您也有重载版本:您也有重载版本: