#include using namespace std; static long double intersectionVolume( long long xa, long long ya, long long za, long long ra_i, long long xb, long long yb, long long zb, long long rb_i ) { const long long dx_i = xa - xb; const long long dy_i = ya - yb; const long long dz_i = za - zb; const __int128 d2_integer = static_cast<__int128>(dx_i) * dx_i + static_cast<__int128>(dy_i) * dy_i + static_cast<__int128>(dz_i) * dz_i; const long long sum_i = ra_i + rb_i; const long long diff_i = llabs(ra_i - rb_i); const __int128 sum2_integer = static_cast<__int128>(sum_i) * sum_i; const __int128 diff2_integer = static_cast<__int128>(diff_i) * diff_i; const long double ra = static_cast(ra_i); const long double rb = static_cast(rb_i); const long double pi = acosl(-1.0L); if (d2_integer >= sum2_integer) { return 0.0L; } if (d2_integer <= diff2_integer) { const long double r = min(ra, rb); return 4.0L * pi * r * r * r / 3.0L; } const long double d2 = static_cast(d2_integer); const long double d = sqrtl(d2); const long double sum_r = ra + rb; // sum_r - d を直接計算すると、外接直前で有効桁を失う。 const long double overlap_depth = (sum_r * sum_r - d2) / (sum_r + d); const long double radius_difference = ra - rb; const long double bracket = d2 + 2.0L * d * sum_r - 3.0L * radius_difference * radius_difference; long double answer = pi * overlap_depth * overlap_depth * bracket / (12.0L * d); if (answer < 0.0L && answer > -1e-18L) answer = 0.0L; return answer; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; cout << scientific << setprecision(20); for (int test_case = 0; test_case < T; ++test_case) { long long xa, ya, za, ra; long long xb, yb, zb, rb; cin >> xa >> ya >> za >> ra; cin >> xb >> yb >> zb >> rb; cout << intersectionVolume(xa, ya, za, ra, xb, yb, zb, rb) << '\n'; } return 0; }