1/*
2
3https://www.musl-libc.org/
4http://git.musl-libc.org/cgit/musl/tree/src/math/exp10.c
5
6musl as a whole is licensed under the following standard MIT license:
7
8----------------------------------------------------------------------
9Copyright © 2005-2014 Rich Felker, et al.
10
11Permission is hereby granted, free of charge, to any person obtaining
12a copy of this software and associated documentation files (the
13"Software"), to deal in the Software without restriction, including
14without limitation the rights to use, copy, modify, merge, publish,
15distribute, sublicense, and/or sell copies of the Software, and to
16permit persons to whom the Software is furnished to do so, subject to
17the following conditions:
18
19The above copyright notice and this permission notice shall be
20included in all copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
26CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29----------------------------------------------------------------------
30
31Authors/contributors include:
32
33Alex Dowad
34Alexander Monakov
35Anthony G. Basile
36Arvid Picciani
37Bobby Bingham
38Boris Brezillon
39Brent Cook
40Chris Spiegel
41Clément Vasseur
42Daniel Micay
43Denys Vlasenko
44Emil Renner Berthing
45Felix Fietkau
46Felix Janda
47Gianluca Anzolin
48Hauke Mehrtens
49Hiltjo Posthuma
50Isaac Dunham
51Jaydeep Patil
52Jens Gustedt
53Jeremy Huntwork
54Jo-Philipp Wich
55Joakim Sindholt
56John Spencer
57Josiah Worcester
58Justin Cormack
59Khem Raj
60Kylie McClain
61Luca Barbato
62Luka Perkov
63M Farkas-Dyck (Strake)
64Mahesh Bodapati
65Michael Forney
66Natanael Copa
67Nicholas J. Kain
68orc
69Pascal Cuoq
70Petr Hosek
71Pierre Carrier
72Rich Felker
73Richard Pennington
74Shiz
75sin
76Solar Designer
77Stefan Kristiansson
78Szabolcs Nagy
79Timo Teräs
80Trutz Behn
81Valentin Ochs
82William Haddon
83
84Portions of this software are derived from third-party works licensed
85under terms compatible with the above MIT license:
86
87The TRE regular expression implementation (src/regex/reg* and
88src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed
89under a 2-clause BSD license (license text in the source files). The
90included version has been heavily modified by Rich Felker in 2012, in
91the interests of size, simplicity, and namespace cleanliness.
92
93Much of the math library code (src/math/ * and src/complex/ *) is
94Copyright © 1993,2004 Sun Microsystems or
95Copyright © 2003-2011 David Schultz or
96Copyright © 2003-2009 Steven G. Kargl or
97Copyright © 2003-2009 Bruce D. Evans or
98Copyright © 2008 Stephen L. Moshier
99and labelled as such in comments in the individual source files. All
100have been licensed under extremely permissive terms.
101
102The ARM memcpy code (src/string/arm/memcpy_el.S) is Copyright © 2008
103The Android Open Source Project and is licensed under a two-clause BSD
104license. It was taken from Bionic libc, used on Android.
105
106The implementation of DES for crypt (src/crypt/crypt_des.c) is
107Copyright © 1994 David Burren. It is licensed under a BSD license.
108
109The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was
110originally written by Solar Designer and placed into the public
111domain. The code also comes with a fallback permissive license for use
112in jurisdictions that may not recognize the public domain.
113
114The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011
115Valentin Ochs and is licensed under an MIT-style license.
116
117The BSD PRNG implementation (src/prng/random.c) and XSI search API
118(src/search/ *.c) functions are Copyright © 2011 Szabolcs Nagy and
119licensed under following terms: "Permission to use, copy, modify,
120and/or distribute this code for any purpose with or without fee is
121hereby granted. There is no warranty."
122
123The x86_64 port was written by Nicholas J. Kain and is licensed under
124the standard MIT terms.
125
126The mips and microblaze ports were originally written by Richard
127Pennington for use in the ellcc project. The original code was adapted
128by Rich Felker for build system and code conventions during upstream
129integration. It is licensed under the standard MIT terms.
130
131The mips64 port was contributed by Imagination Technologies and is
132licensed under the standard MIT terms.
133
134The powerpc port was also originally written by Richard Pennington,
135and later supplemented and integrated by John Spencer. It is licensed
136under the standard MIT terms.
137
138All other files which have no copyright comments are original works
139produced specifically for use as part of this library, written either
140by Rich Felker, the main author of the library, or by one or more
141contibutors listed above. Details on authorship of individual files
142can be found in the git version control history of the project. The
143omission of copyright and license comments in each file is in the
144interest of source tree size.
145
146In addition, permission is hereby granted for all public header files
147(include/ * and arch/ * /bits/ *) and crt files intended to be linked into
148applications (crt/ *, ldso/dlstart.c, and arch/ * /crt_arch.h) to omit
149the copyright notice and permission notice otherwise required by the
150license, and to use these files without any requirement of
151attribution. These files include substantial contributions from:
152
153Bobby Bingham
154John Spencer
155Nicholas J. Kain
156Rich Felker
157Richard Pennington
158Stefan Kristiansson
159Szabolcs Nagy
160
161all of whom have explicitly granted such permission.
162
163This file previously contained text expressing a belief that most of
164the files covered by the above exception were sufficiently trivial not
165to be subject to copyright, resulting in confusion over whether it
166negated the permissions granted in the license. In the spirit of
167permissive licensing, and of not having licensing issues being an
168obstacle to adoption, that text has been removed.
169
170*/
171
172#include <math.h>
173#include <stdint.h>
174#include <stdio.h>
175
176double preciseExp10(double x)
177{
178 if (isnan(x)) return NAN;
179
180 // ranging between DBL_TRUE_MIN and DBL_MAX. Outsiders are treated as zeros or infinities
181 static const double p10[]
182 = {1e-323, 1e-322, 1e-321, 1e-320, 1e-319, 1e-318, 1e-317, 1e-316, 1e-315, 1e-314, 1e-313, 1e-312, 1e-311, 1e-310, 1e-309, 1e-308, 1e-307,
183 1e-306, 1e-305, 1e-304, 1e-303, 1e-302, 1e-301, 1e-300, 1e-299, 1e-298, 1e-297, 1e-296, 1e-295, 1e-294, 1e-293, 1e-292, 1e-291, 1e-290,
184 1e-289, 1e-288, 1e-287, 1e-286, 1e-285, 1e-284, 1e-283, 1e-282, 1e-281, 1e-280, 1e-279, 1e-278, 1e-277, 1e-276, 1e-275, 1e-274, 1e-273,
185 1e-272, 1e-271, 1e-270, 1e-269, 1e-268, 1e-267, 1e-266, 1e-265, 1e-264, 1e-263, 1e-262, 1e-261, 1e-260, 1e-259, 1e-258, 1e-257, 1e-256,
186 1e-255, 1e-254, 1e-253, 1e-252, 1e-251, 1e-250, 1e-249, 1e-248, 1e-247, 1e-246, 1e-245, 1e-244, 1e-243, 1e-242, 1e-241, 1e-240, 1e-239,
187 1e-238, 1e-237, 1e-236, 1e-235, 1e-234, 1e-233, 1e-232, 1e-231, 1e-230, 1e-229, 1e-228, 1e-227, 1e-226, 1e-225, 1e-224, 1e-223, 1e-222,
188 1e-221, 1e-220, 1e-219, 1e-218, 1e-217, 1e-216, 1e-215, 1e-214, 1e-213, 1e-212, 1e-211, 1e-210, 1e-209, 1e-208, 1e-207, 1e-206, 1e-205,
189 1e-204, 1e-203, 1e-202, 1e-201, 1e-200, 1e-199, 1e-198, 1e-197, 1e-196, 1e-195, 1e-194, 1e-193, 1e-192, 1e-191, 1e-190, 1e-189, 1e-188,
190 1e-187, 1e-186, 1e-185, 1e-184, 1e-183, 1e-182, 1e-181, 1e-180, 1e-179, 1e-178, 1e-177, 1e-176, 1e-175, 1e-174, 1e-173, 1e-172, 1e-171,
191 1e-170, 1e-169, 1e-168, 1e-167, 1e-166, 1e-165, 1e-164, 1e-163, 1e-162, 1e-161, 1e-160, 1e-159, 1e-158, 1e-157, 1e-156, 1e-155, 1e-154,
192 1e-153, 1e-152, 1e-151, 1e-150, 1e-149, 1e-148, 1e-147, 1e-146, 1e-145, 1e-144, 1e-143, 1e-142, 1e-141, 1e-140, 1e-139, 1e-138, 1e-137,
193 1e-136, 1e-135, 1e-134, 1e-133, 1e-132, 1e-131, 1e-130, 1e-129, 1e-128, 1e-127, 1e-126, 1e-125, 1e-124, 1e-123, 1e-122, 1e-121, 1e-120,
194 1e-119, 1e-118, 1e-117, 1e-116, 1e-115, 1e-114, 1e-113, 1e-112, 1e-111, 1e-110, 1e-109, 1e-108, 1e-107, 1e-106, 1e-105, 1e-104, 1e-103,
195 1e-102, 1e-101, 1e-100, 1e-99, 1e-98, 1e-97, 1e-96, 1e-95, 1e-94, 1e-93, 1e-92, 1e-91, 1e-90, 1e-89, 1e-88, 1e-87, 1e-86,
196 1e-85, 1e-84, 1e-83, 1e-82, 1e-81, 1e-80, 1e-79, 1e-78, 1e-77, 1e-76, 1e-75, 1e-74, 1e-73, 1e-72, 1e-71, 1e-70, 1e-69,
197 1e-68, 1e-67, 1e-66, 1e-65, 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, 1e-59, 1e-58, 1e-57, 1e-56, 1e-55, 1e-54, 1e-53, 1e-52,
198 1e-51, 1e-50, 1e-49, 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, 1e-40, 1e-39, 1e-38, 1e-37, 1e-36, 1e-35,
199 1e-34, 1e-33, 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, 1e-19, 1e-18,
200 1e-17, 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1,
201 1e0, 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16,
202 1e+17, 1e+18, 1e+19, 1e+20, 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33,
203 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50,
204 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67,
205 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, 1e+81, 1e+82, 1e+83, 1e+84,
206 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, 1e+101,
207 1e+102, 1e+103, 1e+104, 1e+105, 1e+106, 1e+107, 1e+108, 1e+109, 1e+110, 1e+111, 1e+112, 1e+113, 1e+114, 1e+115, 1e+116, 1e+117, 1e+118,
208 1e+119, 1e+120, 1e+121, 1e+122, 1e+123, 1e+124, 1e+125, 1e+126, 1e+127, 1e+128, 1e+129, 1e+130, 1e+131, 1e+132, 1e+133, 1e+134, 1e+135,
209 1e+136, 1e+137, 1e+138, 1e+139, 1e+140, 1e+141, 1e+142, 1e+143, 1e+144, 1e+145, 1e+146, 1e+147, 1e+148, 1e+149, 1e+150, 1e+151, 1e+152,
210 1e+153, 1e+154, 1e+155, 1e+156, 1e+157, 1e+158, 1e+159, 1e+160, 1e+161, 1e+162, 1e+163, 1e+164, 1e+165, 1e+166, 1e+167, 1e+168, 1e+169,
211 1e+170, 1e+171, 1e+172, 1e+173, 1e+174, 1e+175, 1e+176, 1e+177, 1e+178, 1e+179, 1e+180, 1e+181, 1e+182, 1e+183, 1e+184, 1e+185, 1e+186,
212 1e+187, 1e+188, 1e+189, 1e+190, 1e+191, 1e+192, 1e+193, 1e+194, 1e+195, 1e+196, 1e+197, 1e+198, 1e+199, 1e+200, 1e+201, 1e+202, 1e+203,
213 1e+204, 1e+205, 1e+206, 1e+207, 1e+208, 1e+209, 1e+210, 1e+211, 1e+212, 1e+213, 1e+214, 1e+215, 1e+216, 1e+217, 1e+218, 1e+219, 1e+220,
214 1e+221, 1e+222, 1e+223, 1e+224, 1e+225, 1e+226, 1e+227, 1e+228, 1e+229, 1e+230, 1e+231, 1e+232, 1e+233, 1e+234, 1e+235, 1e+236, 1e+237,
215 1e+238, 1e+239, 1e+240, 1e+241, 1e+242, 1e+243, 1e+244, 1e+245, 1e+246, 1e+247, 1e+248, 1e+249, 1e+250, 1e+251, 1e+252, 1e+253, 1e+254,
216 1e+255, 1e+256, 1e+257, 1e+258, 1e+259, 1e+260, 1e+261, 1e+262, 1e+263, 1e+264, 1e+265, 1e+266, 1e+267, 1e+268, 1e+269, 1e+270, 1e+271,
217 1e+272, 1e+273, 1e+274, 1e+275, 1e+276, 1e+277, 1e+278, 1e+279, 1e+280, 1e+281, 1e+282, 1e+283, 1e+284, 1e+285, 1e+286, 1e+287, 1e+288,
218 1e+289, 1e+290, 1e+291, 1e+292, 1e+293, 1e+294, 1e+295, 1e+296, 1e+297, 1e+298, 1e+299, 1e+300, 1e+301, 1e+302, 1e+303, 1e+304, 1e+305,
219 1e+306, 1e+307, 1e+308};
220
221 double n, y = modf(x, &n);
222 if (n > 308) return INFINITY;
223 if (n < -323) return 0;
224
225 // Using lookup table based formula to get accurate results for integer arguments.
226 return exp2(3.32192809488736234787031942948939 * y) * p10[(int)n + 323];
227}
228