Phil Steitz wrote: > --- "Mark R. Diggory" wrote: > >>Thanks for entertaining my sometimes naive questioning, >> >>J.Pietschmann wrote: >>>No. If you cast the base into a double there is not much risk of >>>overflow: double x = n; y=x*x; or y=((double)n)*((double)n); >>>or even y=n*(double)n; (but avoid y=(double)n*n). >>>Double mantissa has IIRC 52 bits, this should be good for integers >>>up to 2^26=67108864 without loss of precision. Is this correct, I've been reading (again, if I'm getting this correctly) the doubles mantissa is capable of supporting 15 -17 decimal places, 2^26 is only 8. http://www.particle.kth.se/~lindsey/JavaCourse/Book/Tech/Chapter02/floatingPt.html >> >>Wow, thats a great clarification, I understand your defense now. It >>would be best to cast n to double asap and always have * operating on >>doubles, so doing things like consolidating the casting of n like this >> >>((double) (n*(n - 1))) > > >>is a poor choice, if I understand correctly, its wiser to do at least >> >>((double) n) * (n - 1) > > > For avoiding overflow maybe, but not for precision, since if n is a long, > n*(n-1) will be computed exactly in the first case and then cast to a double. > Just to clarify, and if I understand correctly, we are only talking about n in terms of "values.length". n is currently any integer >= 0. The concern is that calculating n*n for any n > Integer.MAX_VALUE^(1/2) and for calculating n*n*n for any n > Integer.MAX_VALUE^(1/3) there is significant overflow that can easily be rectified through pre-casting to doubles. I think, that its only when the case that such a method begins to loose precision above the threshold of the double's mantissa of IIRC 52 bits which I think is ~1.0 x 10^17 significant digits, not quite as good as ~1.0 x 10^19 max for long integers, but the behavior is more stable for larger doubles than for longs, resulting initially in loss of precision for numbers > ~1.0 x 10^17 instead of a hard overflow. From this I now draw that its often better to cast the int "n" to double prior to any operations preformed on it. -Mark --------------------------------------------------------------------- To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org For additional commands, e-mail: commons-dev-help@jakarta.apache.org