Whatever Floats Your Boat
I am in the process of revising a CS1 textbook. I made changes requested by users, added snazzy exercises and sample programs, and the publisher sent the draft out to reviewers. A couple of reviewers said in no uncertain terms that I was wrong, wrong, wrong in using
double for my examples. I should use
float instead. Another professor contributed a business problem set that used
float where I would have used
double, or, if I had been allowed,
What gives? For financial calculations,
float aren't so wonderful. For example,
float unitPrice = 34999.95F;
int quantity = 199;
float totalPrice = unitPrice * quantity; // Off by five cents from the correct value
BigDecimal would be the right choice, but they are awful to use in Java.
BigDecimal unitPrice = new BigDecimal("34999.95");
BigDecimal quantity = new BigDecimal("199");
BigDecimal totalPrice = unitPrice.multiply(quantity);
In Scala, you could write
BigDecimal("34999.95") * 100 . But that doesn't help me. Nobody uses Scala for their introductory course. Anyway, reviewers were adamant not to use objects and method calls too early. So,
BigDecimal wasn't going to fly. But I digress.
float. Even if you don't care about limited precision, they are also awkward. You have to remember to put
F after each literal, and you have to cast the results of mathematical methods:
float goldenRatio = 0.5F * (1 + (float) Math.sqrt(5))
For what? Saving four bytes? In a student program that gets executed a handful of times?
I can see the use of
float in a 1000 x 1000 matrix, if the added precision isn't needed, to save the storage. Does it save time? I seem to recall that in an Intel processor, when both
double get extended unless you use
strictfp. No reviewer had requested that I cover that :-)
Am I missing the boat here? Is there another reason to use
float in this day and age, other than saving storage when you have a lot of them? I read through What Every Computer Scientist Should Know About Floating-Point Arithmetic, and was not enlightened. If you use
float, can you tell me why?