Computers spend time, energy, and complexity on providing error-free program execution. But while accuracy is clearly critical for some tasks, perfect precision is wasted on many kinds of programs. For applications from domains like graphics, vision, machine learning, and games, perfect precision is unnecessary or even unattainable. Approximate computing techniques exploit these programs' error resilience to make them more efficient. In this talk, I'll outline some of the recent work going on at UW to make approximate computing useful from both hardware and software perspectives. On the hardware side, we've applied approximation to make solid-state memories like PCM faster, denser, and longer-lasting. In software, we're designing programmer tools and compilers that help guide programmers toward good balances between performance and output quality.