NetBSD-Bugs archive

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

Re: port-i386/58434: single-float functions sometimes return surprisingly much precision



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

From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: port-i386-maintainer%NetBSD.org@localhost, gnats-admin%NetBSD.org@localhost, netbsd-bugs%NetBSD.org@localhost
Subject: Re: port-i386/58434: single-float functions sometimes return surprisingly much precision
Date: Wed, 17 Jul 2024 13:22:35 +0000

 Annotated listing of the relevant disassembly fragment for
 printf("log1pf(1)=%a=%a\n", log1pf(1), log1pf(1)), where y denotes the
 extended precision result of log(1 + x):
 
 	...
 	call	log1pf		# evaluate second argument first
 				# fp stack: y
 	fstps	0x28(%esp)	# pop fp stack and write (float)y to
 				# memory in single-precision
 				# fp stack: (empty)
 	...
 	call	log1pf		# evaluate first argument second
 				# fp stack: y
 	flds	0x28(%esp)	# push (float)y from memory on fp stack
 				# fp stack: (float)y y
 	fstpl	0xc(%esp)	# pop fp stack and write (double)(float)y
 				# to second printf format argument
 				# fp stack: y
 	fstpl	0x4(%esp)	# pop fp stack and write (double)y
 				# to first printf format argument
 				# fp stack: (empty)
 	movl	...,(%esp)	# set printf format string
 	call	printf
 
 But different compilers might do it differently!  The gcc12 shipped in
 Debian 12 saves the intermediate result with fstpl in double-precision
 rather than with fstps in single-precision.  So the output there is:
 
 log1pf(1)=0x1.62e42fefa39efp-1=0x1.62e42fefa39efp-1
 log1p(1)=0x1.62e42fefa39efp-1=0x1.62e42fefa39efp-1
 
 And of course nothing constrains the compiler's order of evaluation or
 order of explicitly rounding intermediate results, so one could also
 see
 
 log1pf(1)=0x1.62e43p-1=0x1.62e42fefa39efp-1
 log1p(1)=0x1.62e42fefa39efp-1=0x1.62e42fefa39efp-1
 
 but I haven't (yet) seen this in practice.
 


Home | Main Index | Thread Index | Old Index