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, BigDecimal
.
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
Clearly, 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.
Back to 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 float
and
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?