Or when students get stuff e-17 out of a function, you teach them what floating point numbers are and what gotcha's they can expect. The simple version is "value is stored as a float, and a float gets rounding errors below e-16", or for the more inquisitive minds you give them nice places like https://docs.python.org/3/tutorial/floatingpoint.html . If they're really going to use what they learn, they're going to run into it sooner or later. So having a bit of base knowledge about floats is a lot more useful than having to google "why does sin() return weird values python". At the very least, they'll isntead google "float limitations", which is going to get them a lot closer to the real information a lot faster. That said, I wouldn't be that opposed to a dedicated type to remember things about pi. Lets say.... class pi(Numeric): """Represents numbers that represent some function of pi""" def __init__(self, mul=1): self.multiplier = mul def __mul__(self, other): if isinstance(other, Numeric): return self.__class__(self.multiplier*other) (similar with the other special methods) (Please consider the idea, not the exact code. I dont even know if i spelled the numeric superclass right. Let alone making this type hashable and immutable, which it should be.) It's probably not a good idea to use that for performance-critical parts, but for the more trivial applications, it could allow for more clarity. Also, in a lot of common angles, it'd be far easier to actually recognize special cases. you could also make it __repr__ like f"Pi*{self.multiplier}", so you get a neat exact answer if you print it..