develooper Front page | perl.perl5.porters | Postings from July 2001

Re: New results with numconvert.t (UTS)

Thread Previous
From:
hom00
Date:
July 2, 2001 13:28
Subject:
Re: New results with numconvert.t (UTS)
Message ID:
200107010028.RAA23661@cepheus.utsglobal.com
> 
> On Sat, Jun 30, 2001 at 10:42:32AM -0700, Hal Morris wrote:
> > You didn't explicitly ask for it, but here it is.
> > Thanks,  Hal Morris,  UTS Global, LLC
> 
> Thanks
> > # '0' ne '4294967296',	4294967295	=> P n + P vs P + P
> > # ok, as string ++ of max_uv is "4294967296", numeric is 0
> 
> Aargh. Why didn't I notice that before?
> 
> I take it that you don't see
> 
> $ perl -e '$a=shift; $a++; printf "%u\n", $a' 4294967295
> 4294967295
> 

Actually, I DO get 4294967295
> 
> Could you try the following test program (in the perl build directory)
> and send the results.
> 
> #include "EXTERN.h"
> #include "perl.h"
> int main (void) {
>   char buffer[256];
>   sprintf (buffer, "UV_MAX_P1='"STRINGIFY(UV_MAX_P1)"'\n%.32g",UV_MAX_P1);
>   puts(buffer);
>   sprintf (buffer, "IV_MAX_P1='"STRINGIFY(IV_MAX_P1)"'\n%.32g",IV_MAX_P1);
>   puts(buffer);
>   sprintf (buffer, "UV_MAX_P1_HALF='"STRINGIFY(UV_MAX_P1_HALF)"'\n%.32g",
>           UV_MAX_P1_HALF);
>   puts(buffer);
>   return 0;
> }

juno> ./nicks-test
UV_MAX_P1='(4.0 * (1 + ((((unsigned long)4294967295u)) >> 2)))'
4294967296
IV_MAX_P1='(2.0 * (1 + (((UV)((long)2147483647)) >> 1)))'
2147483648
UV_MAX_P1_HALF='(2.0 * (1 + ((((unsigned long)4294967295u)) >> 2)))'
2147483648
juno> 
> 
> Could you try the not-quite-one-liner:
> 
> perl -e 'foreach (0..3,28..34,62..64) {print "$_\t", ~0 >> $_; {use integer; print "\t", ~0 >> $_, "\n"}}'
> 
> for which I get
> 
> 0       4294967295      -1
> 1       2147483647      -1
> 2       1073741823      -1
> 3       536870911       -1
> 28      15      -1
> 29      7       -1
> 30      3       -1
> 31      1       -1
> 32      0       -1
> 33      0       -1
> 34      0       -1
> 62      0       -1
> 63      0       -1
> 64      0       -1

juno> sh ni*2.sh                           
0       4294967295      -1
1       2147483647      -1
2       1073741823      -1
3       536870911       -1
28      15      -1
29      7       -1
30      3       -1
31      1       -1
32      0       -1
33      0       -1
34      0       -1
62      0       -1
63      0       -1
64      4294967295      -1
> 
> here.
> I'm curious if you get output that looks like this:
> 
> 0       4294967295    -1
> 1       4294967295    -1
> 2       4294967295    -1
> 3       4294967295    -1
> 
> if you do (and maybe even if you don't) could you try the following patch
> to see if it changes anything:
> 
> --- perl.h.orig Thu Jun 28 16:17:15 2001
> +++ perl.h      Sat Jun 30 17:40:25 2001
> @@ -2165,17 +2165,17 @@
>     May find that some broken compiler will want the value cast to I32.
>     [after the shift, as signed >> may not be as secure as unsigned >>]
>  */
> -#define I32_MAX_P1 (2.0 * (1 + (((U32)I32_MAX) >> 1)))
> -#define U32_MAX_P1 (4.0 * (1 + ((U32_MAX) >> 2)))
> +#define I32_MAX_P1 (2.0 * (1 + (((U32)I32_MAX) / 2)))
> +#define U32_MAX_P1 (4.0 * (1 + ((U32_MAX) / 4)))
>  /* For compilers that can't correctly cast NVs over 0x7FFFFFFF (or
>     0x7FFFFFFFFFFFFFFF) to an unsigned integer. In the future, sizeof(UV)
>     may be greater than sizeof(IV), so don't assume that half max UV is max IV.
>  */
> -#define U32_MAX_P1_HALF (2.0 * (1 + ((U32_MAX) >> 2)))
> +#define U32_MAX_P1_HALF (2.0 * (1 + ((U32_MAX) / 4)))
>  
> -#define UV_MAX_P1 (4.0 * (1 + ((UV_MAX) >> 2)))
> -#define IV_MAX_P1 (2.0 * (1 + (((UV)IV_MAX) >> 1)))
> -#define UV_MAX_P1_HALF (2.0 * (1 + ((UV_MAX) >> 2)))
> +#define UV_MAX_P1 (4.0 * (1 + ((UV_MAX) / 4)))
> +#define IV_MAX_P1 (2.0 * (1 + (((UV)IV_MAX) / 2)))
> +#define UV_MAX_P1_HALF (2.0 * (1 + ((UV_MAX) / 4)))
>  
>  /* This may look like unnecessary jumping through hoops, but converting
>     out of range floating point values to integers *is* undefined behaviour,
> 
> Thanks,
> 
> UTS isn't like a Cray in any way is it?
> 
> Nicholas Clark
> 

I'll let you know how this turns out shortly.

UTS is basically a SysVr4.2 UNIX on IBM 370/390 architecture.  I don't
know anything about Cray's O.S., but if you're talking about the basic
Cray architecture, as I knew it 10-15 years ago, I don't think they're
similar.  It does not, at any rate, have 36-bit words.

Thanks for your help.

Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About