提问人:silverfox 提问时间:6/25/2021 最后编辑:silverfox 更新时间:6/25/2021 访问量:234
为什么“使用命名空间 std;”在 C++ 中处理双精度时会产生不同的结果?
Why "using namespace std;" gives different result when dealing with doubles in C++?
问:
今天,当我遇到一个奇怪的结果时,我正试图回答这篇文章(关于检查是否可以构造三角形)。
通过测试,这段代码:15.15 35.77 129.07
#include <iostream>
using namespace std;
const double e = 0.000001;
void f(double a, double b, double c)
{
if (abs(180 - (a+b+c)) > e) {cout << "test"; }
}
int main()
{
double a,b,c; cin >> a >> b >> c;
f(a,b,c);
}
照常打印,而这:test
#include <iostream>
const double e = 0.000001;
void f(double a, double b, double c)
{
if (abs(180 - (a+b+c)) > e) {std::cout << "test"; }
}
int main()
{
double a,b,c; std::cin >> a >> b >> c;
f(a,b,c);
}
不。唯一的区别是行(当我添加到第二段代码时,正如预期的那样,它运行正常)。using namespace std;
using namespace std;
随着时间的推移,我读了很多关于的帖子:using namespace std;
但似乎唯一要做的就是偷工减料,以换取偶尔的类/变量/命名空间名称冲突(在争论是否使用它时最常提到的一点)。using namespace std;
我确实找到了 1 个相关帖子:为什么 g++(4.6 和 4.7)将这种除法的结果提升为双倍?我可以阻止它吗?,但我在其他地方没有找到更多信息。
那么我在这里错过了什么?
-- 一些机器信息:
- Windows 10,64 位
- 代码::Blocks 20.03
- GCC/G++ 6.3.0 版本
答:
1赞
Jorengarenar
6/25/2021
#1
那是因为你没有添加 ,因此编译器并不真正知道它是什么函数,因此 UB。它很可能已经找到并使用了 C 版本的函数,该函数是为参数而制作的。std::
abs()
int
7赞
YSC
6/25/2021
#2
您确实存在名称冲突:int abs(int)
与 double std::abs(double)。
使用 ,可以找到两者,并且是更好的匹配项。using namespace std;
abs(180 - (a+b+c))
std::abs
没有 ,只找到前者,并且需要转换为,因此观察到的行为。using namespace std;
abs(180 - (a+b+c))
int
你真正想要的是:
#include <iostream>
const double e = 0.000001;
void f(double a, double b, double c)
{
if (std::abs(180 - (a+b+c)) > e) {std::cout << "test"; }
}
int main()
{
double a,b,c; std::cin >> a >> b >> c;
f(a,b,c);
}
评论
2赞
YSC
6/25/2021
请注意,您还可以用于显式记录您不使用整数版本的意图。std::fabs
0赞
silverfox
6/25/2021
啊,我明白了。所以我找到的帖子确实对这个案子有一些权利。我真的困惑了一段时间。
评论
abs
<iostream>
abs
abs
#include <cmath>
abs
std::abs
test
constexpr
double a,b,c; std::cin >> a >> b >> c;
double a = 15.15, b = 35.77, c = 129.07;
namespace std