当比较两个"真实"数字是否相等时,为什么我不应该使用==运算符,而我应该使用什么呢?
coersion和cast之间有什么区别?我的一般假设是,当你强制一个值为另一种类型时,如下所示:
int n = 9;
return double(n)/5;
Run Code Online (Sandbox Code Playgroud) 我曾经用#define替换const,但是在下面的例子中它打印为false.
#include <iostream>
#define x 3e+38
using namespace std;
int main() {
float p = x;
if (p==x)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但如果我更换
#define x 3e+38
Run Code Online (Sandbox Code Playgroud)
同
const float x = 3e+38;
Run Code Online (Sandbox Code Playgroud)
它运作得很好,问题是为什么?(我知道有几个主题讨论#define vs const,但是真的没有得到这个,请赐教我)
我有路径集 A 和路径集 B。我试图找到一种算法来比较两个路径集的相似性。
路径特性:
应该考虑比例,即一个小的 X 应该匹配一个大的 X。对于任何路径都不需要考虑平移,因为任何路径的最底部点的 y 将为 0,任何路径的最左边点将x 为 0。
是否有最佳实践或众所周知的算法(我在 Google 搜索中几乎没有发现)来比较这些类型的路径集的相似性?
在C++中,我想测试传递给函数的值是否为非零,并在该条件下基于某些行为.
例如:
void do_something(float x){
if(x) // <-- prefer this format?
do_a();
else
do_b();
}
Run Code Online (Sandbox Code Playgroud)
VS:
void do_something(float x){
if(x != 0) // <-- or this format?
do_a();
else
do_b();
}
Run Code Online (Sandbox Code Playgroud)
其他形式:
void do_something(int x){
x? do_a() : do_b(); // <-- prefer this?
x!=0? do_a() : do_b(); // <-- or this?
}
Run Code Online (Sandbox Code Playgroud)
这些都是"形成良好",或者是否有某种原因在某些情况下会出现未定义的行为?
我在godbolt.org上测试过,两种形式都生成完全相同的汇编代码.我使用int,float,ternary运算符和if()进行了测试,并且在所有情况下,代码对于两种形式看起来都相同.
我目前倾向于使用if(x != 0)为float/ double,和if(x)为int,有些是由于不同的NaN的浮点值的复杂性,以及其它特殊值.
可能重复:
我应该如何进行浮点比较?
是不是建议在C++中比较double和double文字的相等性,因为我猜它是依赖于编译器的?
更准确地说,比较硬编码的双精度(源代码中的文字)和应该计算的双精度是不行的,因为计算结果的最后一个数字可能因编译器而异. .这不标准化吗?
我听说这是在Knuth的TeXbook中提到的,是吗?
如果这一切都是真的,那么解决方案是什么?
由于浮点数的内部表示而知道不准确(请参阅维基百科,搜索到:"使用相等测试"......),在执行时仍然会出现意外情况:
% expr int(0.57 * 10000)
5699
% expr int([expr 0.57 * 10000])
5700
Run Code Online (Sandbox Code Playgroud)
是否嵌套expr禁止?为什么它会改变通过的浮点值?或者它是否会改变浮点运算的顺序,那些影响结果的是什么?
更新:有关比较浮点数与速度(和次要链接),一些基础知识而不是基础知识以及IEEE 754-2008标准描述的主题.
使用以下代码,
#include <stdio.h>
int main(void){
float x;
x=(float)3.3==3.3;
printf("%f",x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出为0.00000
但当数字3.3被3.5替换时,
#include <stdio.h>
int main(void){
float x;
x=(float)3.5==3.5;
printf("%f",x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出为1.0000
为什么输出有差异?
我有两个大小接近 1000 的整数向量,我要做的是检查这两个向量的平方整数之和是否相同。所以我写了以下代码:
std::vector<int> array1;
std::vector<int> array2;
... // initialize array1 and array2, and in the experiment all elements
// in the two vectors are the same but the sequence of elements may be different.
// For example: array1={1001, 2002, 3003, ....}
// array2={2002, 3003, 1001, ....}
assert(array1.size() == array2.size());
float sum_array1 = 0;
float sum_array2 = 0;
for(int i=0; i<array1.size(); i++)
sum_array1 +=array1[i]*array1[i];
for(int i=0; i<array2.size(); i++)
sum_array2 +=array2[i]*array2[i];
Run Code Online (Sandbox Code Playgroud)
我希望这sum_array1应该等于sum_array2,但实际上在我的应用程序中我发现它们不同sum_array1 = 1.2868639e+009而sum_array2 …
触发联合非活动成员的左值到右值转换不是常量表达式。也就是说,给定union:
template<class T, class U>
union A {
constexpr A(T t) : t_{t} {}
constexpr A(U u) : u_{u} {}
T t_;
U u_;
};
Run Code Online (Sandbox Code Playgroud)
和constexpr功能foo:
template<class T, class U>
constexpr auto foo() {
A<T, U> a(T{});
return a.u_;
}
Run Code Online (Sandbox Code Playgroud)
以下程序:
int main() {
constexpr auto test = foo<int, double>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
失败并显示错误消息:
error: constexpr variable 'test' must be initialized by a
constant expression
constexpr auto test = foo<int, double>();
^ ~~~~~~~~~~~~~~~~~~
note: …Run Code Online (Sandbox Code Playgroud) 我想确定一个点是否在圆圈内.所以我这样做:
(x - center_x)^2 + (y - center_y)^2 < radius^2
但我的坐标是double,我想我应该用epsilon做,所以
fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2 ) < EPS更好吗?