summaryrefslogtreecommitdiff
path: root/ext/standard/float_to_double.c
diff options
context:
space:
mode:
authorKeyur Govande <keyur@php.net>2015-01-06 06:33:38 +0000
committerKeyur Govande <keyur@php.net>2015-01-07 22:45:23 +0000
commitf2eadb93b9268bca86d3f67e8d8cf2fa2767a54d (patch)
tree56ac0c8b57b2e8487b8fc99984fb1f09be05ad4d /ext/standard/float_to_double.c
parent3f1d1892c9000b7485a11806821e33539a964b08 (diff)
downloadphp-git-f2eadb93b9268bca86d3f67e8d8cf2fa2767a54d.tar.gz
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()
Diffstat (limited to 'ext/standard/float_to_double.c')
-rw-r--r--ext/standard/float_to_double.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/ext/standard/float_to_double.c b/ext/standard/float_to_double.c
new file mode 100644
index 0000000000..5aff1fe9c4
--- /dev/null
+++ b/ext/standard/float_to_double.c
@@ -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
+ */