 2912f9f2a2
			
		
	
	2912f9f2a2
	
	
	
		
			
			Backport most important fixes up to latest HEAD - Taken post-commit reverts/fixes into account Compile tested Run-tested on cns3xxx & imx6 targets Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
		
			
				
	
	
		
			31 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 51ab6db4ed115d079d7131975e4adb074ba9ef9d Mon Sep 17 00:00:00 2001
 | |
| From: Szabolcs Nagy <nsz@port70.net>
 | |
| Date: Wed, 12 Oct 2016 00:49:59 +0200
 | |
| Subject: fix float formatting of some exact halfway cases
 | |
| 
 | |
| in nearest rounding mode exact halfway cases were not following the
 | |
| round to even rule if the rounding happened at a base 1000000000 digit
 | |
| boundary of the internal representation and the previous digit was odd.
 | |
| 
 | |
| e.g. printf("%.0f", 1.5) printed 1 instead of 2.
 | |
| ---
 | |
|  src/stdio/vfprintf.c | 3 ++-
 | |
|  1 file changed, 2 insertions(+), 1 deletion(-)
 | |
| 
 | |
| diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
 | |
| index e2ab2dc..60da14d 100644
 | |
| --- a/src/stdio/vfprintf.c
 | |
| +++ b/src/stdio/vfprintf.c
 | |
| @@ -345,7 +345,8 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
 | |
|  		if (x || d+1!=z) {
 | |
|  			long double round = 2/LDBL_EPSILON;
 | |
|  			long double small;
 | |
| -			if (*d/i & 1) round += 2;
 | |
| +			if ((*d/i & 1) || (i==1000000000 && d>a && (d[-1]&1)))
 | |
| +				round += 2;
 | |
|  			if (x<i/2) small=0x0.8p0;
 | |
|  			else if (x==i/2 && d+1==z) small=0x1.0p0;
 | |
|  			else small=0x1.8p0;
 | |
| -- 
 | |
| cgit v0.11.2
 |