C++比较器保证和内部工作原理

C++ comparator guarantees and inner workings

本文关键字:工作 内部 比较器 C++      更新时间:2023-10-16

解决这个问题,我发现

if(!(p<arr[i]))

if(p>=arr[i])

可能会有不同的结果(plong longarr[i]double),因为第一个解决方案被接受,第二个解决方案不被接受。 为什么?

上下文的完整代码:

#include <bits/stdc++.h>
#define EPS (1e-5)
using namespace std;
typedef long long ll;
double arr[10005];
int main(){
    ll D,p;
    string s;
    while(getline(cin,s)){
        stringstream ss(s);
        ss>>D>>p;
        int n=0;
        while(ss>>arr[n]) ++n;
        ll dmin=D+1;
        if(n<D+1){
            double a=arr[n-4];
            double b=arr[n-3];
            double c=arr[n-2];
            double d=arr[n-1];
            double den=a*c-b*b;
            double s=(c*c-b*d)/den;
            double t=(a*d-b*c)/den;
            for(int i=n;i<=D;++i)
                arr[i]=s*arr[i-2]+t*arr[i-1];
        }
        for(int i=0;i<=D;++i){
            if(!(p<arr[i]))
                dmin=min(dmin,D-i);
            else
                break;
        }
        if(dmin==0) cout<<"The spider may fall!"<<endl;
        else if(dmin==D+1) cout<<"The spider is going to fall!"<<endl;
        else cout<<dmin<<endl;
    }
}

如果!(a<b)(a>=b)不同,那么最可能的解释是其中一个是NaN。任何涉及 NaN 的比较都会导致 false ,所以如果b是 NaN,那么(a<b)(a>=b)都是假的,!(a<b)都是真的。

首先查看您的代码:

double den=a*c-b*b;
double s=(c*c-b*d)/den;
double t=(a*d-b*c)/den;

没有明显的理由说明den不能为零,在这种情况下,st都将是无穷大。然后,计算:

for(int i=n;i<=D;++i)
  arr[i]=s*arr[i-2]+t*arr[i-1];

如果st是无穷大,那么产生arr[i]的总和就有足够的空间成为NaN。同一符号的两个无穷大之和是无穷大本身,但两个相反符号的无穷大之和是 NaN。此外,0 和无穷大的乘积是 NaN。

一旦 NaN 进入 arr ,它将传播,因为每个元素都依赖于前一个元素。

因此,如果den为 0,您可能需要执行某些操作。