| 1 | /* |
| 2 | |
| 3 | https://www.musl-libc.org/ |
| 4 | http://git.musl-libc.org/cgit/musl/tree/src/math/exp10.c |
| 5 | |
| 6 | musl as a whole is licensed under the following standard MIT license: |
| 7 | |
| 8 | ---------------------------------------------------------------------- |
| 9 | Copyright © 2005-2014 Rich Felker, et al. |
| 10 | |
| 11 | Permission is hereby granted, free of charge, to any person obtaining |
| 12 | a copy of this software and associated documentation files (the |
| 13 | "Software"), to deal in the Software without restriction, including |
| 14 | without limitation the rights to use, copy, modify, merge, publish, |
| 15 | distribute, sublicense, and/or sell copies of the Software, and to |
| 16 | permit persons to whom the Software is furnished to do so, subject to |
| 17 | the following conditions: |
| 18 | |
| 19 | The above copyright notice and this permission notice shall be |
| 20 | included in all copies or substantial portions of the Software. |
| 21 | |
| 22 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 23 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 24 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
| 25 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
| 26 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| 27 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| 28 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 29 | ---------------------------------------------------------------------- |
| 30 | |
| 31 | Authors/contributors include: |
| 32 | |
| 33 | Alex Dowad |
| 34 | Alexander Monakov |
| 35 | Anthony G. Basile |
| 36 | Arvid Picciani |
| 37 | Bobby Bingham |
| 38 | Boris Brezillon |
| 39 | Brent Cook |
| 40 | Chris Spiegel |
| 41 | Clément Vasseur |
| 42 | Daniel Micay |
| 43 | Denys Vlasenko |
| 44 | Emil Renner Berthing |
| 45 | Felix Fietkau |
| 46 | Felix Janda |
| 47 | Gianluca Anzolin |
| 48 | Hauke Mehrtens |
| 49 | Hiltjo Posthuma |
| 50 | Isaac Dunham |
| 51 | Jaydeep Patil |
| 52 | Jens Gustedt |
| 53 | Jeremy Huntwork |
| 54 | Jo-Philipp Wich |
| 55 | Joakim Sindholt |
| 56 | John Spencer |
| 57 | Josiah Worcester |
| 58 | Justin Cormack |
| 59 | Khem Raj |
| 60 | Kylie McClain |
| 61 | Luca Barbato |
| 62 | Luka Perkov |
| 63 | M Farkas-Dyck (Strake) |
| 64 | Mahesh Bodapati |
| 65 | Michael Forney |
| 66 | Natanael Copa |
| 67 | Nicholas J. Kain |
| 68 | orc |
| 69 | Pascal Cuoq |
| 70 | Petr Hosek |
| 71 | Pierre Carrier |
| 72 | Rich Felker |
| 73 | Richard Pennington |
| 74 | Shiz |
| 75 | sin |
| 76 | Solar Designer |
| 77 | Stefan Kristiansson |
| 78 | Szabolcs Nagy |
| 79 | Timo Teräs |
| 80 | Trutz Behn |
| 81 | Valentin Ochs |
| 82 | William Haddon |
| 83 | |
| 84 | Portions of this software are derived from third-party works licensed |
| 85 | under terms compatible with the above MIT license: |
| 86 | |
| 87 | The TRE regular expression implementation (src/regex/reg* and |
| 88 | src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed |
| 89 | under a 2-clause BSD license (license text in the source files). The |
| 90 | included version has been heavily modified by Rich Felker in 2012, in |
| 91 | the interests of size, simplicity, and namespace cleanliness. |
| 92 | |
| 93 | Much of the math library code (src/math/ * and src/complex/ *) is |
| 94 | Copyright © 1993,2004 Sun Microsystems or |
| 95 | Copyright © 2003-2011 David Schultz or |
| 96 | Copyright © 2003-2009 Steven G. Kargl or |
| 97 | Copyright © 2003-2009 Bruce D. Evans or |
| 98 | Copyright © 2008 Stephen L. Moshier |
| 99 | and labelled as such in comments in the individual source files. All |
| 100 | have been licensed under extremely permissive terms. |
| 101 | |
| 102 | The ARM memcpy code (src/string/arm/memcpy_el.S) is Copyright © 2008 |
| 103 | The Android Open Source Project and is licensed under a two-clause BSD |
| 104 | license. It was taken from Bionic libc, used on Android. |
| 105 | |
| 106 | The implementation of DES for crypt (src/crypt/crypt_des.c) is |
| 107 | Copyright © 1994 David Burren. It is licensed under a BSD license. |
| 108 | |
| 109 | The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was |
| 110 | originally written by Solar Designer and placed into the public |
| 111 | domain. The code also comes with a fallback permissive license for use |
| 112 | in jurisdictions that may not recognize the public domain. |
| 113 | |
| 114 | The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011 |
| 115 | Valentin Ochs and is licensed under an MIT-style license. |
| 116 | |
| 117 | The BSD PRNG implementation (src/prng/random.c) and XSI search API |
| 118 | (src/search/ *.c) functions are Copyright © 2011 Szabolcs Nagy and |
| 119 | licensed under following terms: "Permission to use, copy, modify, |
| 120 | and/or distribute this code for any purpose with or without fee is |
| 121 | hereby granted. There is no warranty." |
| 122 | |
| 123 | The x86_64 port was written by Nicholas J. Kain and is licensed under |
| 124 | the standard MIT terms. |
| 125 | |
| 126 | The mips and microblaze ports were originally written by Richard |
| 127 | Pennington for use in the ellcc project. The original code was adapted |
| 128 | by Rich Felker for build system and code conventions during upstream |
| 129 | integration. It is licensed under the standard MIT terms. |
| 130 | |
| 131 | The mips64 port was contributed by Imagination Technologies and is |
| 132 | licensed under the standard MIT terms. |
| 133 | |
| 134 | The powerpc port was also originally written by Richard Pennington, |
| 135 | and later supplemented and integrated by John Spencer. It is licensed |
| 136 | under the standard MIT terms. |
| 137 | |
| 138 | All other files which have no copyright comments are original works |
| 139 | produced specifically for use as part of this library, written either |
| 140 | by Rich Felker, the main author of the library, or by one or more |
| 141 | contibutors listed above. Details on authorship of individual files |
| 142 | can be found in the git version control history of the project. The |
| 143 | omission of copyright and license comments in each file is in the |
| 144 | interest of source tree size. |
| 145 | |
| 146 | In addition, permission is hereby granted for all public header files |
| 147 | (include/ * and arch/ * /bits/ *) and crt files intended to be linked into |
| 148 | applications (crt/ *, ldso/dlstart.c, and arch/ * /crt_arch.h) to omit |
| 149 | the copyright notice and permission notice otherwise required by the |
| 150 | license, and to use these files without any requirement of |
| 151 | attribution. These files include substantial contributions from: |
| 152 | |
| 153 | Bobby Bingham |
| 154 | John Spencer |
| 155 | Nicholas J. Kain |
| 156 | Rich Felker |
| 157 | Richard Pennington |
| 158 | Stefan Kristiansson |
| 159 | Szabolcs Nagy |
| 160 | |
| 161 | all of whom have explicitly granted such permission. |
| 162 | |
| 163 | This file previously contained text expressing a belief that most of |
| 164 | the files covered by the above exception were sufficiently trivial not |
| 165 | to be subject to copyright, resulting in confusion over whether it |
| 166 | negated the permissions granted in the license. In the spirit of |
| 167 | permissive licensing, and of not having licensing issues being an |
| 168 | obstacle to adoption, that text has been removed. |
| 169 | |
| 170 | */ |
| 171 | |
| 172 | #include <math.h> |
| 173 | #include <stdint.h> |
| 174 | #include <stdio.h> |
| 175 | |
| 176 | double 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 | |