Yes, for IEEE754 floating point. I hope the other fp systems have been eradicated from the face of the earth by now. Unless you want to port AST to a IBM 7094 it should work :)
Olga On Mon, Aug 12, 2013 at 11:52 PM, Glenn Fowler <[email protected]> wrote: > > On Sun, 11 Aug 2013 10:43:06 +0200 Tina Harriott wrote: >> On Wed, Jul 24, 2013 at 7:28 PM, Glenn Fowler <[email protected]> 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. > > here is a general question about C floating point that will determine > how to handle different floating point types in ksh arithmetic > > given > float a; > long double b; > float c; > > a = <some valid float number>; > b = a; > c = b; > > is this always true > a == c > > _______________________________________________ > ast-users mailing list > [email protected] > http://lists.research.att.com/mailman/listinfo/ast-users -- , _ _ , { \/`o;====- Olga Kryzhanovska -====;o`\/ } .----'-/`-/ [email protected] \-`\-'----. `'-..-| / http://twitter.com/fleyta \ |-..-'` /\/\ Solaris/BSD//C/C++ programmer /\/\ `--` `--` _______________________________________________ ast-users mailing list [email protected] http://lists.research.att.com/mailman/listinfo/ast-users
