On 11/25/08, Roland Mainz <[EMAIL PROTECTED]> wrote:
> Roland Mainz wrote:
>  >
>  > Hi!
>  >
>  > ----
>  >
>  > Is there a reason why ksh93 does not display the negative sign for the
>  > value zero ? For example if I have use the C99 function "copysign"
>  > (copies absolute value of operant a and sign of operant b) I get this
>  > for { a=5, b=-0 }:
>  > -- snip --
>  > $ ksh93 -c 'float x; (( x=copysign(5, -0) )) ; printf "%f\n"
>  > x'
>  > -5.000000
>  > -- snip --
>  >
>  > Now if I swap operands a and b I get this result:
>  > -- snip --
>  > $ ksh93 -c 'float x; (( x=copysign(0, -5) )) ; printf "%f\n"
>  > x'
>  > 0.000000
>  > -- snip --
>  >
>  > AFAIK this result should be "-0.000000" ... or not ?
>  >
>  > BTW: Parsing of "-0" doesn't seem to work either, e.g.
>  > -- snip --
>  > $ ksh93 -c 'float x a=-1 b=-0; (( x=copysign(a, b) )) ; printf "%f\n"
>  > x'
>
>
> There is a small mistake: -0 is an integer value - it should be "-0." in
>  this case, e.g. the line should be:
>  -- snip --
>  $ ksh93 -c 'float x a=-1.0 b=-0.0; (( x=copysign(a, b) )) ; printf
>  "%f\n" x'
>  -- snip --
>
>
>  > 1.000000
>  > -- snip --
>  > ... while AFAIK it should be "-1.000000" since the 2nd operand of
>  > "copysign" defines the sign of the result.
>
>
> BTW: As someone else pointed out the C99 spec for "copysign" allows some
>  "leeway", however my primary concern was that the shell does not seem
>  parse "-0.0" correctly and that $ printf "%a\n" x # does not return the
>  sign of zero.
>
>  For comparisation the following testcase...
>  -- snip --
>  #include <stdlib.h>
>  #include <stdio.h>
>  #include <math.h>
>
>  #define SD(x) strtod(#x, NULL)
>
>  int main(int ac, char *av[])
>  {
>         double a, b, result;
>
>         a=SD(5.), b=SD(-0.);
>         result=copysign(a, b);
>         printf("a=%f, b=%f, result1=%f, %a\n", a, b, result, result);
>
>         a=SD(-0.), b=SD(5.);
>         result=copysign(a, b);
>         printf("a=%f, b=%f, result1=%f, %a\n", a, b, result, result);
>
>         a=SD(-0.), b=SD(-5.);
>         result=copysign(a, b);
>         printf("a=%f, b=%f, result1=%f, %a\n", a, b, result, result);
>
>         return EXIT_SUCCESS;
>  }
>  -- snip --
>  ... returns on Solaris 11/SPARC:
>  -- snip --
>  $ rm -f a.out ; cc -xc99=%all -lm
>  zerosign.c
>  $
>  ./a.out
>  a=5.000000, b=-0.000000, result1=-5.000000, -0x1.4000000000000p+2
>  a=-0.000000, b=5.000000, result1=0.000000, 0x0.0000000000000p+0
>  a=-0.000000, b=-5.000000, result1=-0.000000, -0x0.0000000000000p+0
>  -- snip --
>  ... and on SuSE Linux 10.0:
>  -- snip --
>   ./a.out
>  a=5.000000, b=-0.000000, result1=-5.000000, -0x1.4p+2
>  a=-0.000000, b=5.000000, result1=0.000000, 0x0p+0
>  a=-0.000000, b=-5.000000, result1=-0.000000, -0x0p+0
>  -- snip --
>
>  Somehow it looks only the shell looses the sign of a negative zero value
>  in this case.

I think I've seen code in print.c which tests for 0. and not iszero()
as required. This is unfortunately only half the bug since the parser
misreads typeset -E x=-0.0 as x=0.0.

Irek
_______________________________________________
ast-users mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-users

Reply via email to