Browse Source
Fix for bugs #68114 (Build fails on OS X due to undefined symbols)
Fix for bugs #68114 (Build fails on OS X due to undefined symbols)
and #68657 (Reading 4 byte floats with Mysqli and libmysqlclient has rounding errors). The patch removes support for Decimal floating point numbers and now defaults to using similar logic as what libmysqlclient does: convert a 4 byte floating point number into a string, and then the string into a double. The quirks of MySQL are maintained as seen in Field_Float::val_str()pull/983/head
9 changed files with 141 additions and 91 deletions
-
29ext/mysqli/mysqli_api.c
-
6ext/mysqli/tests/010.phpt
-
18ext/mysqli/tests/bug67839.phpt
-
31ext/mysqlnd/config9.m4
-
53ext/mysqlnd/mysqlnd_ps_codec.c
-
3ext/standard/config.m4
-
2ext/standard/config.w32
-
55ext/standard/float_to_double.c
-
35ext/standard/float_to_double.h
@ -0,0 +1,55 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 2006-2014 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Keyur Govande <kgovande@gmail.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#include <float.h> |
|||
#include "float_to_double.h" |
|||
#include "main/snprintf.h" |
|||
|
|||
#define MAX_BUF_LEN 255 |
|||
|
|||
#ifndef FLT_DIG |
|||
# define FLT_DIG 6 |
|||
#endif |
|||
|
|||
/* |
|||
* Convert from a 4-byte float to a 8-byte decimal by first converting |
|||
* the float to a string, and then the string to a double. |
|||
* The decimals argument specifies the precision of the output. If decimals |
|||
* is less than zero, then a gcvt(3) like logic is used with the significant |
|||
* digits set to FLT_DIG i.e. 6. |
|||
*/ |
|||
double float_to_double(float fp4, int decimals) { |
|||
char num_buf[MAX_BUF_LEN]; /* Over allocated */ |
|||
|
|||
if (decimals < 0) { |
|||
php_gcvt(fp4, FLT_DIG, '.', 'e', num_buf); |
|||
} else { |
|||
php_sprintf(num_buf, "%.*f", decimals, fp4); |
|||
} |
|||
|
|||
return zend_strtod(num_buf, NULL); |
|||
} |
|||
|
|||
/* |
|||
* Local variables: |
|||
* tab-width: 4 |
|||
* c-basic-offset: 4 |
|||
* End: |
|||
* vim600: noet sw=4 ts=4 fdm=marker |
|||
* vim<600: noet sw=4 ts=4 |
|||
*/ |
|||
@ -0,0 +1,35 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 2006-2014 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Keyur Govande <kgovande@gmail.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#ifndef FLOAT_TO_DOUBLE_H |
|||
#define FLOAT_TO_DOUBLE_H |
|||
|
|||
#include "main/php.h" |
|||
|
|||
PHPAPI double float_to_double(float fp4, int decimals); |
|||
|
|||
#endif /* FLOAT_TO_DOUBLE_H */ |
|||
|
|||
/* |
|||
* Local variables: |
|||
* tab-width: 4 |
|||
* c-basic-offset: 4 |
|||
* End: |
|||
* vim600: noet sw=4 ts=4 fdm=marker |
|||
* vim<600: noet sw=4 ts=4 |
|||
*/ |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue