On Wed, Jul 24, 2013 at 7:28 PM, Glenn Fowler <g...@research.att.com> wrote: > > On Wed, 24 Jul 2013 19:02:39 +0200 Tina Harriott wrote: >> Here's one of my little tough problems which I am unable to solve >> myself, even after looking at the source code of ast-ksh. The problem >> below requires a good understanding how floating point numbers are >> implemented in computers. > >> I'm trying to prototype code and like to iterate over a small, linear >> area by using the C library function nextafter() to step forward the >> smallest possible distance between each step, and print the number of >> iterations needed to cover the distance between 4 and 4.000000000001: >> ksh -c 'float v ; integer iter ; for ((iter=0,v=4 ; v < 4.000000000001 >> && iter < 10000000; v=nextafter(v,4.000000000001))) ; do >> ((iter++));done;print $iter ' >> 2305843 > >> The result 2305843 is correct. > >> However, if I use typeset -E (or just typeset) to declare the variable >> v the loop runs forever, or in this case until it hits iter < 10000000 >> which I added as safeguard later: >> ksh -c 'typeset -E v ; integer iter ; for ((iter=0,v=4 ; v < >> 4.000000000001 && iter < 10000000; v=nextafter(v,4.000000000001))) ; >> do ((iter++));done;print $iter ' >> 10000000 > >> Can anyone explain this? > > float is an alias > this shows the alias definition > type float > which is > typeset -lE > this documents -l > typeset --?l > > so for your example > typeset -E > gave you a double v and > typeset -lE > would give you a "long double" v
But why does nextafter() misbehave if I want to use a datatype smaller than "long double"? Accuracy is a good thing, but in this case we iterate too fine-grained, meaning the code should iterate over the smallest possible steps of a double, but not over the smallest possible steps of a long double. Tina -- Tina Harriott - Women in Mathematics Contact: tina.harriott.m...@gmail.com _______________________________________________ ast-users mailing list ast-users@lists.research.att.com http://lists.research.att.com/mailman/listinfo/ast-users