E×B drift · crossed fields
Cross an electric field with a magnetic one and charges march sideways. Does that drift speed depend on the charge or the mass — do heavy and light, plus and minus, drift apart?

▶ Run the simulationSee the measured result
Units: m/s — E×B drift speed v_d = |E×B|/B² = E/B at E = 10 kV/m, B = 10 mT: Thomson's velocity-selector speed
How the lab tests it
Cross a uniform E (pointing up) with B (out of the plane) and launch four charges from rest in separate lanes: three of the same +q with masses m = 1, 2, 3, plus one with q = −1. Each is pushed by the Boris algorithm (half electric kick · exact magnetic rotation · half kick), tracing a cycloid; the lab time-averages each particle's drift velocity ⟨v⟩ from its trajectory and plots it against q and m.
What it checks
the E×B drift velocity v_d = (E×B)/B² — speed E/B, perpendicular to BOTH fields and containing NO charge and NO mass: heavy charges trace fat slow loops (radius r = mE/qB² ∝ m), light ones tiny fast loops, the negative charge loops the other way — yet all four guiding centres drift in the same direction at the same rate, the measured ⟨v⟩(q,m) a flat line at E/B
Velocity selector calculator (E×B drift, cyclotron frequency, Larmor radius, cycloid geometry, and the relativistic γ³)
Cross an electric field with a magnetic one and every charge in the gap marches sideways at the same speed. That is the whole of it, and it is stranger than it sounds: the march is perpendicular to the electric field rather than along it, and its speed E/B contains no charge, no mass and no memory of how the particle was launched. An electron and a dust grain drift in lockstep; reverse the charge and the loops wind the other way while the march does not move at all. Thomson built a cathode-ray instrument out of that in 1897 — set E and B so the beam passes undeflected and you have measured its speed without knowing anything else about it — and every mass spectrometer since has begun with the same two crossed fields. This page computes the five numbers that instrument is made of, and assembles every one of them from the four boxes above rather than storing any. It calls no implementation-approximated function at all: square root, absolute value and pi are the entire library, which is why the figures below are printed in full instead of being rounded to a width that hides what the browser did. Three of the spellings are chosen rather than inherited, and each choice is a domain rather than a decimal: the gyro rate is assembled as (q/m)·B and not q·B/m, because at q = m = B = 10⁻²⁰⁰ — three ordinary numbers in three ordinary boxes — the second spelling underflows to zero and answers a rate of nothing; the Larmor radius divides before it multiplies for the same reason; and the loop height never forms B², which costs nothing and buys the whole low-field end of the range. The relativistic direction carries the sharpest of them: γ − 1 written the way every textbook prints it, 1/√(1−β²) − 1, returns exactly 0.000000 at β = 10⁻¹², which is not a small error but the complete loss of the answer, while the algebraically identical β²/(s(1+s)) returns 5e-25. And it carries one result this lab measured numerically and never wrote a formula for: the simulation above clocks the gyroperiod of a relativistic drifting charge at 1.1016 cyclotron periods, and that number is γ³ — γ² because the magnetic field is weaker in the drifting frame and the particle is heavier there, times one more γ because the drifting frame's clock is slow — 1.1016485962545537, assembled here from the fields alone.
v_d = E/B (no q, no m) · Wien filter: E = v*B · omega_c = (q/m)*B, f_c = omega_c/2pi, T_c = 2pi/omega_c · r_L = (m/q)*(v/B) · cycloid: v_max = 2*v_d, loop height h = 2*(m/q)*(E/B)/B, advance per loop = pi*h · relativistic: beta = v_d/c, gamma = 1/sqrt(1-beta^2), gyroperiod = gamma^3*T_c