C++比较器保证和内部工作原理
C++ comparator guarantees and inner workings
解决这个问题,我发现
if(!(p<arr[i]))
和
if(p>=arr[i])
可能会有不同的结果(p
是long long
,arr[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
不能为零,在这种情况下,s
和t
都将是无穷大。然后,计算:
for(int i=n;i<=D;++i)
arr[i]=s*arr[i-2]+t*arr[i-1];
如果s
和t
是无穷大,那么产生arr[i]
的总和就有足够的空间成为NaN。同一符号的两个无穷大之和是无穷大本身,但两个相反符号的无穷大之和是 NaN。此外,0 和无穷大的乘积是 NaN。
一旦 NaN 进入 arr
,它将传播,因为每个元素都依赖于前一个元素。
因此,如果den
为 0,您可能需要执行某些操作。
相关文章:
- C++代码停止工作错误使用cout内部函数
- std::strlen 在内部是如何工作的?
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 指向C++中成员的指针如何在内部工作?
- 删除和删除[]在内部如何工作?
- C 功能如何内部工作
- 自动参数如何在内部工作
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 函数指针仅在 main 内部工作
- 不要在心理上理解这个内部循环是如何工作的
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- (c++)无法让 void 函数工作,主.cpp内部的几行也有问题
- 为什么SFINAE(enable_if)从类定义内部工作而不是从外部工作
- 如何将负数转换为更广泛的类型在内部工作
- c++运算符=工作异常(函数内部输出正常,但返回后错误)
- std::remove_const 如何在<T>内部工作
- 如何与CUDA中的结构内部结构一起工作
- C++:析构函数内部如何工作以及谁调用默认析构函数
- Sendmessage在方法定义内部无法正常工作