summaryrefslogtreecommitdiff
path: root/libc/src/stdlib/strtod.cpp
diff options
context:
space:
mode:
authorMichael Jones <michaelrj@google.com>2021-09-01 23:51:05 +0000
committerMichael Jones <michaelrj@google.com>2021-10-18 16:10:03 -0700
commit87c016078ad72c46505461e4ff8bfa04819fe7ba (patch)
tree91521ff2bbe9ef913e20e0636ee8e7f0d96861f5 /libc/src/stdlib/strtod.cpp
parent684b6265b31cabf422b01cd8937a3641c6df914f (diff)
[libc] add atof, strtof and strtod
Add the string to floating point conversion functions. Long doubles aren't supported yet, but floats and doubles are. The primary algorithm used is the Eisel-Lemire ParseNumberF64 algorithm, with the Simple Decimal Conversion algorithm as backup. Links for more information on the algorithms: Number Parsing at a Gigabyte per Second, Software: Practice and Experience 51 (8), 2021 (https://arxiv.org/abs/2101.11408) https://nigeltao.github.io/blog/2020/eisel-lemire.html https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html Differential Revision: https://reviews.llvm.org/D109261
Diffstat (limited to 'libc/src/stdlib/strtod.cpp')
-rw-r--r--libc/src/stdlib/strtod.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/libc/src/stdlib/strtod.cpp b/libc/src/stdlib/strtod.cpp
new file mode 100644
index 000000000000..754918c36789
--- /dev/null
+++ b/libc/src/stdlib/strtod.cpp
@@ -0,0 +1,20 @@
+//===-- Implementation of strtod ------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/stdlib/strtod.h"
+#include "src/__support/common.h"
+#include "src/__support/str_to_float.h"
+
+namespace __llvm_libc {
+
+LLVM_LIBC_FUNCTION(double, strtod,
+ (const char *__restrict str, char **__restrict str_end)) {
+ return internal::strtofloatingpoint<double>(str, str_end);
+}
+
+} // namespace __llvm_libc