/*@ predicate my_killing_prop(double uc, double up, int n) */
/*@ requires 2 <= N <= 2^^26 &&
@ \exact(u0)==u0 && \exact(u1)==u1 &&
@ \forall int k; 0 <= k <= N => |u0+k*(u1-u0)| <= 1
@ ensures \exact(\result)==u0+N*(u1-u0) &&
@ \round_error(\result) <= (N)*(N+1)/2.*2^^(-53)
@*/
double comput_seq(double u0, double u1, int N) {
int i;
double uprev, ucur,tmp;
uprev=u0;
ucur=u1;
/*@ invariant 2 <= i && i <= N+1 &&
@ \exact(ucur) ==u0+(i-1)*(u1-u0) &&
@ \exact(uprev)==u0+(i-2)*(u1-u0) &&
@ my_killing_prop(ucur,uprev,i-2)
@ variant N-i*/
for (i=2; i<=N; i++) {
tmp=2*ucur;
/*@ assert tmp==2*ucur */
tmp-=uprev;
uprev=ucur;
ucur=tmp;
}
return ucur;
}