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
您也有重载版本:您也有重载版本: