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

Reply via email to