A good answer might be:
- Will this new program compile?
- Yes. The compiler will not complain about anything.
- Will it run?
- Yes. It will run without any error messages.
- Is it correct?
- No. There is an error which may be hard to find because
the two loops are not self-contained.
- No. There is an error which may be hard to find because
Floating Point Loop Control
For counting loops it is best to use an integer for
the loop control variable.
However,
it is legal to use a floating point control variable and to use fractional increments.
The following program prints a table that displays
x and ln(x) for values of
x from 0.1 up to about 2.0:
class LogTable
{
public static void main ( String[] args )
{
System.out.println( "x" + "\t ln(x)" );
for ( double x = 0.1; x <= 2.0; x = x + 0.1 )
System.out.println( x + "\t" + Math.log( x ) );
}
}
It compiles correctly, and runs.
But its output is not pretty:
x ln(x) 0.1 -2.3025850929940455 0.2 -1.6094379124341003 0.30000000000000004 -1.203972804325936 0.4 -0.916290731874155 0.5 -0.6931471805599453 0.6 -0.5108256237659907 0.7 -0.35667494393873245 0.7999999999999999 -0.22314355131420985 0.8999999999999999 -0.1053605156578264 0.9999999999999999 -1.1102230246251565E-16 1.0999999999999999 0.09531017980432474 1.2 0.1823215567939546 1.3 0.26236426446749106 1.4000000000000001 0.336472236621213 1.5000000000000002 0.40546510810816455 1.6000000000000003 0.47000362924573574 1.7000000000000004 0.5306282510621706 1.8000000000000005 0.5877866649021193 1.9000000000000006 0.641853886172395
Remember (from a previous chapter) that floating point numbers are not
absolutely accurate.
In particular, 0.1 is always slightly wrong when represented
inside a computer, no matter how many bits are used.
The errors in x accumulate,
and x drifts away from the desired value.
Notice that the last x in the table is not 2.0 as
you would expect with accurate numbers.
