unittest
{
	assert( [ "2 2 4" ].parse.expand.solve == "45.000000" );
	assert( [ "12 21 10" ].parse.expand.solve == "89.783464" );
	assert( [ "3 1 8" ].parse.expand.solve == "4.236395" );
	
	assert( [ "10 10 1000" ].parse.expand.solve == "0.000000" );		// 追加ケース
}



import std.conv;
import std.format;
import std.math;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto abx = input.front.split.to!( real[] );
	return tuple( abx[ 0 ], abx[ 1 ], abx[ 2 ] );
}

auto solve( real a, real b, real x )
{
	if( x == a * a * b ) return "0.000000";
	
	auto y = x / a;
	auto ans = 0.0L;
	if( a * a * b / 2 < x )
	{
		// 水筒の体積の半分以下のときは、傾けたときの水の形が四角柱になる（断面は台形）
		// 台形の端の部分を切って直角三角形に揃える
		auto f = y / ( a / 2 ) - b;
		b -= f;
		y -= f * a;
	}
	
	// 水筒の体積の半分以下のときは、傾けたときの水の形が三角柱になる（断面は直角三角形）
	auto c = y * 2 / b;							// 三角柱断面のbじゃないほうの辺の長さ
	auto d = ( b ^^ 2 + c ^^ 2 ) ^^ 0.5;		// 三角柱断面の斜辺の長さ
	auto e = y * 2 / d;							// 床から限界まで傾けた水筒の口までの高さ
	ans = 90 - asin( e / b ) * 180 / PI;
	
	return format( "%0.6f", ans );
}
