相关疑难解决方法(0)

两个一般的CS问题

当比较两个"真实"数字是否相等时,为什么我不应该使用==运算符,而我应该使用什么呢?

coersion和cast之间有什么区别?我的一般假设是,当你强制一个值为另一种类型时,如下所示:

int n = 9;
return double(n)/5;
Run Code Online (Sandbox Code Playgroud)

c++ floating-point

5
推荐指数
1
解决办法
441
查看次数

const vs #define(奇怪的行为)

我曾经用#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,但是真的没有得到这个,请赐教我)

c++ const

5
推荐指数
1
解决办法
104
查看次数

比较两条路径的相似性

我有路径集 A 和路径集 B。我试图找到一种算法来比较两个路径集的相似性。

路径特性:

  1. 路径集是一条或多条线,每条线有两个或多个点。不必连接线路。
  2. 路径集可能会自身重叠(即 X)。
  3. 路径集可能包含不同数量的顶点(即一条路径可能看起来与另一条相似,但其中包含更多点)。
  4. 不能保证点对于两个路径集都是有序的。

应该考虑比例,即一个小的 X 应该匹配一个大的 X。对于任何路径都不需要考虑平移,因为任何路径的最底部点的 y 将为 0,任何路径的最左边点将x 为 0。

是否有最佳实践或众所周知的算法(我在 Google 搜索中几乎没有发现)来比较这些类型的路径集的相似性?

algorithm vector-graphics

5
推荐指数
1
解决办法
3020
查看次数

首选if(x!= 0)over if(x)是否为float,int值?

在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++

5
推荐指数
0
解决办法
178
查看次数

将双打与双重文字进行比较?

可能重复:
我应该如何进行浮点比较?

是不是建议在C++中比较double和double文字的相等性,因为我猜它是依赖于编译器的?

更准确地说,比较硬编码的双精度(源代码中的文字)和应该计算的双精度是不行的,因为计算结果的最后一个数字可能因编译器而异. .这不标准化吗?

我听说这是在Knuth的TeXbook中提到的,是吗?

如果这一切都是真的,那么解决方案是什么?

c++ floating-point double comparison compare

4
推荐指数
1
解决办法
2405
查看次数

当`expr`嵌套在Tcl中时,为什么算术结果会有所不同?

由于浮点数的内部表示而知道不准确(请参阅维基百科,搜索到:"使用相等测试"......),在执行时仍然会出现意外情况:

% expr int(0.57 * 10000)
5699
% expr int([expr 0.57 * 10000])
5700
Run Code Online (Sandbox Code Playgroud)

是否嵌套expr禁止?为什么它会改变通过的浮点值?或者它是否会改变浮点运算的顺序,那些影响结果的是什么?

更新:有关比较浮点数与速度(和次要链接),一些基础知识而不是基础知识以及IEEE 754-2008标准描述的主题.

floating-point expression tcl

4
推荐指数
1
解决办法
1287
查看次数

浮点数等式检查

使用以下代码,

#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

为什么输出有差异?

c floating-point

4
推荐指数
2
解决办法
4042
查看次数

为什么两个浮点型变量具有不同的值

我有两个大小接近 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+009sum_array2 …

c++

4
推荐指数
1
解决办法
1841
查看次数

宽松常量表达式中联合非活动成员的左值到右值转换的解决方法

触发联合非活动成员的左值到右值转换不是常量表达式。也就是说,给定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)

c++ unions constexpr c++14

4
推荐指数
1
解决办法
403
查看次数

比较c ++中的双打

我想确定一个点是否在圆圈内.所以我这样做:

(x - center_x)^2 + (y - center_y)^2 < radius^2

但我的坐标是double,我想我应该用epsilon做,所以 fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2 ) < EPS更好吗?

c++ double compare

4
推荐指数
1
解决办法
600
查看次数