#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstdio>

using namespace std;

typedef long double ld;

const int TYRE = 10001;
const int NODE = 101;
const int INF = (1<<25);

struct State{
  int x, pos;
  ld t;
  bool operator < (const State& s) const {
    return t > s.t;
  }
};

vector<int> V;

ld T[TYRE][NODE];
int n;
ld b,r,v,e,f;


void solve(){
  fill(T[0],T[0]+TYRE*NODE,(ld)INF);

  priority_queue<State> Q;
  Q.push((State){0,0,0});

  while(!Q.empty()){

    State now = Q.top(); Q.pop();
    if(now.pos == n) continue;

    if(T[now.x][now.pos] < now.t) continue;

    //change tyre
    
    State nex = now;
    nex.x = 0;
    nex.t += b;
    int diff = V[now.pos+1]-V[now.pos];
    
    for(int i = 0; i < diff; i++){
      if(nex.x >= r) nex.t += 1.0/(v-e*(nex.x-r));
      else nex.t += 1.0/(v-f*(r-nex.x));
      nex.x++;
    }
    nex.pos++;
    
    if(T[nex.x][nex.pos] > nex.t) {
      T[nex.x][nex.pos] = nex.t;
      Q.push(nex);
    }

    //not change tyre
    nex = now;

    for(int i = 0; i < diff; i++){
      if(nex.x >= r) nex.t += 1.0/(v-e*(nex.x-r));
      else nex.t += 1.0/(v-f*(r-nex.x));
      nex.x++;
    }

    nex.pos++;
    
    if(T[nex.x][nex.pos] > nex.t) {
      T[nex.x][nex.pos] = nex.t;
      Q.push(nex);
    }
  }
  ld ans = (ld)INF;
  
  for(int i = 0; i < TYRE; i++) ans = min(ans,T[i][n]);

  printf("%.4Lf\n",ans);
}


void input(){
  V.resize(n+1); V[0] = 0;
  for(int i = 1; i <= n; i++) cin >> V[i];
  cin >> b >> r >> v >> e >> f;
}

int main(){
  
  while(cin >> n && n){
    input();
    solve();
  }
  return 0;
}