#include <iostream>
#include <cmath>

// =======================================================================
// 以下、積分内容の設定
// =======================================================================

// 被積分関数 (積分対象の関数)
double f(double x) {
	return cos(x);
}

const double A = 0.0;  // 積分区間の下端 (x軸上の左端)
const double B = 1.0;  // 積分区間の上端 (y軸上の左端)
const int N = 10000;   // 数値積分における区間分割数 (刻み数)

// ※ C/C++ の int の最大値は、環境によっては意外と小さいため要注意です。
//    必要に応じて long long や int64_t 等を使ってください (ループ変数等も)。


// =======================================================================
// 以下、積分の値を数値的に求める処理
// =======================================================================

int main() {
	double delta = (B - A) / N;  // 足し上げる微小区間の幅 (刻み幅)
	double value = 0.0;		  // この変数に積分値を足し上げていく

	// 積分区間をN分割した微小区間を、左(下端)から右(上端)へ順に辿るループ
	for(int i=0; i<N; ++i) {
		
		// i 番目の微小区間における、左端の x 座標値を求める
		double x = A + i * delta;

		// -------------------------------------------------------------------
		// 以下、i 番目の微小区間の面積を求め、積分値に加算 (どれか 1 つ選択)
		// -------------------------------------------------------------------

		// 矩形法 (長方形で近似した微小領域の面積を足す)
		// value += f(x) * delta;

		// 台形法 (台形で近似した微小領域の面積を足す)
		// value += ( f(x) + f(x+delta) ) * delta / 2.0;

		// シンプソン法 (二次関数で近似した微小領域の面積を足す)
		value += ( f(x) + f(x+delta) + 4.0 * f(x+delta/2.0) ) * delta / 6.0;
	}

	// 結果を表示
	std::cout << value << std::endl;
	
	return 0;
}