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

时间:2016-02-01 02:21:09

标签: c++ operators standards

解决this problem,我找到了

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;
    }
}

1 个答案:

答案 0 :(得分:1)

如果kafka_<scala_version>!(a<b)不同,那么最可能的解释是其中一个是NaN。 涉及NaN的任何比较会产生(a>=b),因此如果false是NaN,则b(a<b)都将为false,并且{ {1}}将是真的。

首先看看你的代码:

(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都将是无穷大。然后,你计算:

s

如果tfor(int i=n;i<=D;++i) arr[i]=s*arr[i-2]+t*arr[i-1]; 是最重要的,那么总和有足够的空间可以使s成为NaN。相同符号的两个无穷大的总和是无穷大本身,但两个相反符号的无穷大的总和是NaN。此外,0和无穷大的乘积是NaN。

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

因此,如果arr[i]为0,您可能需要做一些事情。