thanks On Tue, 13 Aug 2013 00:00:59 +0200 =?KOI8-R?B?z8zYx8Egy9LZ1sHOz9fTy8HR?= wrote: > 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
