For any real k >= 1 and any int x, round( round( k x ) / k ) = x That's really simple and really wasn't obvious to me. Quikproof: whether or not k = 1, | kx - round(kx) | / k < .5. This extends to x in Z^n, since everything applies componentwise. Mathematically, if k >= 1, x |--> round( k x ) is injective (a.k.a. "one-to-one") but not bijective (I'm cribbing from wikipedia). But computer science-wise, it's "invertible," meaning it's injective and... reasonably easy to compute the exact inverse of a point that has an inverse. So now I'm slightly wiser about the terms "invertible" and "one-to-one function". I focused down to that simplest example while reading, "A global method for invertible integer DCT and integer wavelet algorithms," by Gerlind Plonka. More generally for any given orthogonal matrix A like a Fourier transform, there's a constant k such that for any int input vector x, F( x ) = round( k A x ) round( 1/k A^-1 F( x ) ) = x What's important about that is that F(x) gets closer to the true transform than doing individual butterflies (say) in a reversible integer way. Yet it seems to me that if k >> 1, this expands the frequency-domain numbers so they require...some constant number more bits each, sort of pyrrhic in the background context, which is compression. So, reading on. --Steve