gpt4 book ai didi

c++ - g++编译器中奇怪的将转换范围缩小为两倍到 float 警告

转载 作者:行者123 更新时间:2023-12-02 09:55:57 24 4
gpt4 key购买 nike

我有这个功能,可以从极谱表示法创建一个在其中使用支撑初始化程序的 vector :

// Constructs a 2D vector from XY-coordinates.
inline vector2(float x, float y) : x_(x), y_(y) { }

// Constructs a 2D vector from polar coordinates
static vector2 polar(float r, float phi) {
return {r * cos(phi), r * sin(phi)};
}

在MSVS中,一切似乎都很好,但是g++编译器显示的警告对我来说似乎很奇怪:
vector2.h:37:23: warning: narrowing conversion of ‘(((double)r) * cos(((double)phi)))’ from ‘double’ to ‘float’ inside { } [-Wnarrowing]
return {r * cos(phi), r * sin(phi)};
~~^~~~~~~~~~

如果我使用构造函数,警告消失:
// Constructs a 2D vector from polar coordinates
static vector2 polar(float r, float phi) {
return vector2(r * cos(phi), r * sin(phi));
}

为什么会出现此警告?这是否意味着已编译的程序将进行从 floatdouble并再回到 float的不必要的转换?

更新
这是最小的可复制示例
#include <iostream>
#include <cmath>

using std::cout;
using std::endl;

class Pair {
public:
float x_;
float y_;

inline Pair(float x, float y) : x_(x), y_(y) {};

};

Pair braced(float a) {
return {a * 2, cos(a) * 3};
}

Pair constr(float a) {
return Pair(a * 2, cos(a) * 3);
}

Pair stdbraced(float a) {
return {a * 2, std::cos(a) * 3};
}

Pair stdconstr(float a) {
return Pair(a * 2, std::cos(a) * 3);
}

int main() {
float x = 2.0;
auto a = braced(x);
cout << a.x_ << ' ' << a.y_ << endl;
auto b = constr(x);
cout << b.x_ << ' ' << b.y_ << endl;
auto c = stdbraced(x);
cout << c.x_ << ' ' << c.y_ << endl;
auto d = stdconstr(x);
cout << d.x_ << ' ' << d.y_ << endl;
}
g++ test.cpp -o test的输出:
test.cpp: In function ‘Pair braced(float)’:
test.cpp:15:27: warning: narrowing conversion of ‘(cos(((double)a)) * (double)3)’ from ‘double’ to ‘float’ inside { } [-Wnarrowing]
return {a*2,cos(a)*3};
~~~~~~^~

因此,使用 std::cos可以提供帮助。但是主要的问题仍然存在(困扰我)-为什么仅在使用初始化初始化时才出现警告?

最佳答案

如果您发布整个源代码,将很有帮助。

根据您发布的内容,我假设您没有类似的内容

using namespace std;

因此 cos()sin()是旧的C版本。他们俩都希望输入 double类型。 cosf()sinf()是需要 float 的函数。由于您使用的是c++,因此要使用STL函数,而不要使用旧的C函数。

所以做以下

static vector2 polar(float r, float phi) {
return {r * std::cos(phi), r * std::sin(phi)};
}

STL函数是重载,因此它们将float和double作为输入,而没有任何隐式转换。

关于c++ - g++编译器中奇怪的将转换范围缩小为两倍到 float 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60110022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com