import std.stdio, std.conv, std.string, std.bigint;
import std.math, std.random, std.datetime;
import std.array, std.range, std.algorithm, std.container, std.format;
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }

/*

確率漸化式
確率DP 期待値DP
小数 近似値 絶対誤差

i個目のコイン(i = 0 , 1, ...)まで投げて表がちょうどj枚であった確率 xs[i][j]

xs[i][j] = p[i] * xs[i - 1][j - 1] + (1 - p[i]) * xs[i - 1][j]

これは、jが大きい方から見ていく前提で

xs[j] = p[i] * xs[j - 1] + (1 - p[i]) * xs[j]

とかける

求めるものは

sum(j > n - j) xs[j]

*/

void main(){
	int n = read.to!int;
	
	real[] ps = readln.chomp.split.map!(to!real).array;
	
	real[] xs = [1.0];
	foreach(i; 0 .. n){
		xs ~= 0.0;
		foreach_reverse(j; 0 .. i + 2){
			xs[j] *= 1.0 - ps[i];
			if(j > 0) xs[j] += ps[i] * xs[j - 1];
		}
		debug writeln("xs:", xs);
	}
	
	
	real ans = 0.0;
	foreach(j; n / 2 + 1 .. n + 1){
		ans += xs[j];
	}
	
	ans.format!"%0.12f".writeln;
	
}
