NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-sparc64/47536: printf conversion fails for long double on sparc64



The following reply was made to PR port-sparc64/47536; it has been noted by 
GNATS.

From: Martin Husemann <martin%duskware.de@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: port-sparc64/47536: printf conversion fails for long double on 
sparc64
Date: Wed, 13 Feb 2013 08:30:10 +0100

 [forwarded to gnats to update the ticket]
 
 Martin
 
 ---8<---
 
 From: christos%astron.com@localhost (Christos Zoulas)
 Subject: Re: port-sparc64/47536: printf conversion fails for long double on 
sparc64
 Date: Wed, 13 Feb 2013 03:31:17 +0000 (UTC)
 
 
 In article <20130207154009.746AE63EF83%www.NetBSD.org@localhost>,
 Jukka Ruohonen  <gnats-bugs%NetBSD.org@localhost> wrote:
 >The following reply was made to PR port-sparc64/47536; it has been noted
 >by GNATS.
 >
 >From: Jukka Ruohonen <jruohonen%iki.fi@localhost>
 >To: gnats-bugs%NetBSD.org@localhost
 >Cc: 
 >Subject: Re: port-sparc64/47536: printf conversion fails for long double
 >on sparc64
 >Date: Thu, 7 Feb 2013 17:12:27 +0200
 >
 > On Wed, Feb 06, 2013 at 02:35:01PM +0000, martin%NetBSD.org@localhost wrote:
 > > This is a test program by Edward Berner posted to the Fossil users list:
 > > 
 > > #include <stdio.h>
 > > 
 > > int
 > > main (int argc, char *argv[])
 > > {
 > >    long long n;
 > >    long double ld;
 > > 
 > >    n = 2147483648LL;
 > >    ld = n; 
 > >    printf (" n = %lld\n", n);
 > >    printf ("ld = %0.17Lg\n", ld);
 > > 
 > >    return 0;
 > > }
 > 
 > Looks like a test case? Perhaps if augmented with some other comparable
 > cases, similar problems in other architectures could be also revealed
 > (cf. e.g. the innocent PR lib/22019; lib/32951; lib/44113).
 
 The sign bit is not set in the long long -> long double conversion.
 Printf is not at fault.
 
 #include <stdio.h>
 int
 main(int argc, char *argv[])
 {
         union {
                 long double ld;
                 long long n[2];
         } u;
 
         u.ld = 2147483648LL;
 #ifdef __sparc64__
         u.n[1] = 0x0000000080000000llu;
 #endif
         printf("%zu, %zu\n", sizeof(u.ld), sizeof(u.n));
         printf(" u.n %llx %llx\n", u.n[0], u.n[1]);
         printf("u.ld %0.17Lg\n", u.ld);
         return 0;
 }
 
 christos
 


Home | Main Index | Thread Index | Old Index