Approximate Computing: From Circuits to Software