xref: /aosp_15_r20/external/abseil-cpp/absl/strings/internal/pow10_helper.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/strings/internal/pow10_helper.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <cmath>
18*9356374aSAndroid Build Coastguard Worker 
19*9356374aSAndroid Build Coastguard Worker namespace absl {
20*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
21*9356374aSAndroid Build Coastguard Worker namespace strings_internal {
22*9356374aSAndroid Build Coastguard Worker 
23*9356374aSAndroid Build Coastguard Worker namespace {
24*9356374aSAndroid Build Coastguard Worker 
25*9356374aSAndroid Build Coastguard Worker // The exact value of 1e23 falls precisely halfway between two representable
26*9356374aSAndroid Build Coastguard Worker // doubles. Furthermore, the rounding rules we prefer (break ties by rounding
27*9356374aSAndroid Build Coastguard Worker // to the nearest even) dictate in this case that the number should be rounded
28*9356374aSAndroid Build Coastguard Worker // down, but this is not completely specified for floating-point literals in
29*9356374aSAndroid Build Coastguard Worker // C++. (It just says to use the default rounding mode of the standard
30*9356374aSAndroid Build Coastguard Worker // library.) We ensure the result we want by using a number that has an
31*9356374aSAndroid Build Coastguard Worker // unambiguous correctly rounded answer.
32*9356374aSAndroid Build Coastguard Worker constexpr double k1e23 = 9999999999999999e7;
33*9356374aSAndroid Build Coastguard Worker 
34*9356374aSAndroid Build Coastguard Worker constexpr double kPowersOfTen[] = {
35*9356374aSAndroid Build Coastguard Worker     0.0,    1e-323, 1e-322, 1e-321, 1e-320, 1e-319, 1e-318, 1e-317, 1e-316,
36*9356374aSAndroid Build Coastguard Worker     1e-315, 1e-314, 1e-313, 1e-312, 1e-311, 1e-310, 1e-309, 1e-308, 1e-307,
37*9356374aSAndroid Build Coastguard Worker     1e-306, 1e-305, 1e-304, 1e-303, 1e-302, 1e-301, 1e-300, 1e-299, 1e-298,
38*9356374aSAndroid Build Coastguard Worker     1e-297, 1e-296, 1e-295, 1e-294, 1e-293, 1e-292, 1e-291, 1e-290, 1e-289,
39*9356374aSAndroid Build Coastguard Worker     1e-288, 1e-287, 1e-286, 1e-285, 1e-284, 1e-283, 1e-282, 1e-281, 1e-280,
40*9356374aSAndroid Build Coastguard Worker     1e-279, 1e-278, 1e-277, 1e-276, 1e-275, 1e-274, 1e-273, 1e-272, 1e-271,
41*9356374aSAndroid Build Coastguard Worker     1e-270, 1e-269, 1e-268, 1e-267, 1e-266, 1e-265, 1e-264, 1e-263, 1e-262,
42*9356374aSAndroid Build Coastguard Worker     1e-261, 1e-260, 1e-259, 1e-258, 1e-257, 1e-256, 1e-255, 1e-254, 1e-253,
43*9356374aSAndroid Build Coastguard Worker     1e-252, 1e-251, 1e-250, 1e-249, 1e-248, 1e-247, 1e-246, 1e-245, 1e-244,
44*9356374aSAndroid Build Coastguard Worker     1e-243, 1e-242, 1e-241, 1e-240, 1e-239, 1e-238, 1e-237, 1e-236, 1e-235,
45*9356374aSAndroid Build Coastguard Worker     1e-234, 1e-233, 1e-232, 1e-231, 1e-230, 1e-229, 1e-228, 1e-227, 1e-226,
46*9356374aSAndroid Build Coastguard Worker     1e-225, 1e-224, 1e-223, 1e-222, 1e-221, 1e-220, 1e-219, 1e-218, 1e-217,
47*9356374aSAndroid Build Coastguard Worker     1e-216, 1e-215, 1e-214, 1e-213, 1e-212, 1e-211, 1e-210, 1e-209, 1e-208,
48*9356374aSAndroid Build Coastguard Worker     1e-207, 1e-206, 1e-205, 1e-204, 1e-203, 1e-202, 1e-201, 1e-200, 1e-199,
49*9356374aSAndroid Build Coastguard Worker     1e-198, 1e-197, 1e-196, 1e-195, 1e-194, 1e-193, 1e-192, 1e-191, 1e-190,
50*9356374aSAndroid Build Coastguard Worker     1e-189, 1e-188, 1e-187, 1e-186, 1e-185, 1e-184, 1e-183, 1e-182, 1e-181,
51*9356374aSAndroid Build Coastguard Worker     1e-180, 1e-179, 1e-178, 1e-177, 1e-176, 1e-175, 1e-174, 1e-173, 1e-172,
52*9356374aSAndroid Build Coastguard Worker     1e-171, 1e-170, 1e-169, 1e-168, 1e-167, 1e-166, 1e-165, 1e-164, 1e-163,
53*9356374aSAndroid Build Coastguard Worker     1e-162, 1e-161, 1e-160, 1e-159, 1e-158, 1e-157, 1e-156, 1e-155, 1e-154,
54*9356374aSAndroid Build Coastguard Worker     1e-153, 1e-152, 1e-151, 1e-150, 1e-149, 1e-148, 1e-147, 1e-146, 1e-145,
55*9356374aSAndroid Build Coastguard Worker     1e-144, 1e-143, 1e-142, 1e-141, 1e-140, 1e-139, 1e-138, 1e-137, 1e-136,
56*9356374aSAndroid Build Coastguard Worker     1e-135, 1e-134, 1e-133, 1e-132, 1e-131, 1e-130, 1e-129, 1e-128, 1e-127,
57*9356374aSAndroid Build Coastguard Worker     1e-126, 1e-125, 1e-124, 1e-123, 1e-122, 1e-121, 1e-120, 1e-119, 1e-118,
58*9356374aSAndroid Build Coastguard Worker     1e-117, 1e-116, 1e-115, 1e-114, 1e-113, 1e-112, 1e-111, 1e-110, 1e-109,
59*9356374aSAndroid Build Coastguard Worker     1e-108, 1e-107, 1e-106, 1e-105, 1e-104, 1e-103, 1e-102, 1e-101, 1e-100,
60*9356374aSAndroid Build Coastguard Worker     1e-99,  1e-98,  1e-97,  1e-96,  1e-95,  1e-94,  1e-93,  1e-92,  1e-91,
61*9356374aSAndroid Build Coastguard Worker     1e-90,  1e-89,  1e-88,  1e-87,  1e-86,  1e-85,  1e-84,  1e-83,  1e-82,
62*9356374aSAndroid Build Coastguard Worker     1e-81,  1e-80,  1e-79,  1e-78,  1e-77,  1e-76,  1e-75,  1e-74,  1e-73,
63*9356374aSAndroid Build Coastguard Worker     1e-72,  1e-71,  1e-70,  1e-69,  1e-68,  1e-67,  1e-66,  1e-65,  1e-64,
64*9356374aSAndroid Build Coastguard Worker     1e-63,  1e-62,  1e-61,  1e-60,  1e-59,  1e-58,  1e-57,  1e-56,  1e-55,
65*9356374aSAndroid Build Coastguard Worker     1e-54,  1e-53,  1e-52,  1e-51,  1e-50,  1e-49,  1e-48,  1e-47,  1e-46,
66*9356374aSAndroid Build Coastguard Worker     1e-45,  1e-44,  1e-43,  1e-42,  1e-41,  1e-40,  1e-39,  1e-38,  1e-37,
67*9356374aSAndroid Build Coastguard Worker     1e-36,  1e-35,  1e-34,  1e-33,  1e-32,  1e-31,  1e-30,  1e-29,  1e-28,
68*9356374aSAndroid Build Coastguard Worker     1e-27,  1e-26,  1e-25,  1e-24,  1e-23,  1e-22,  1e-21,  1e-20,  1e-19,
69*9356374aSAndroid Build Coastguard Worker     1e-18,  1e-17,  1e-16,  1e-15,  1e-14,  1e-13,  1e-12,  1e-11,  1e-10,
70*9356374aSAndroid Build Coastguard Worker     1e-9,   1e-8,   1e-7,   1e-6,   1e-5,   1e-4,   1e-3,   1e-2,   1e-1,
71*9356374aSAndroid Build Coastguard Worker     1e+0,   1e+1,   1e+2,   1e+3,   1e+4,   1e+5,   1e+6,   1e+7,   1e+8,
72*9356374aSAndroid Build Coastguard Worker     1e+9,   1e+10,  1e+11,  1e+12,  1e+13,  1e+14,  1e+15,  1e+16,  1e+17,
73*9356374aSAndroid Build Coastguard Worker     1e+18,  1e+19,  1e+20,  1e+21,  1e+22,  k1e23,  1e+24,  1e+25,  1e+26,
74*9356374aSAndroid Build Coastguard Worker     1e+27,  1e+28,  1e+29,  1e+30,  1e+31,  1e+32,  1e+33,  1e+34,  1e+35,
75*9356374aSAndroid Build Coastguard Worker     1e+36,  1e+37,  1e+38,  1e+39,  1e+40,  1e+41,  1e+42,  1e+43,  1e+44,
76*9356374aSAndroid Build Coastguard Worker     1e+45,  1e+46,  1e+47,  1e+48,  1e+49,  1e+50,  1e+51,  1e+52,  1e+53,
77*9356374aSAndroid Build Coastguard Worker     1e+54,  1e+55,  1e+56,  1e+57,  1e+58,  1e+59,  1e+60,  1e+61,  1e+62,
78*9356374aSAndroid Build Coastguard Worker     1e+63,  1e+64,  1e+65,  1e+66,  1e+67,  1e+68,  1e+69,  1e+70,  1e+71,
79*9356374aSAndroid Build Coastguard Worker     1e+72,  1e+73,  1e+74,  1e+75,  1e+76,  1e+77,  1e+78,  1e+79,  1e+80,
80*9356374aSAndroid Build Coastguard Worker     1e+81,  1e+82,  1e+83,  1e+84,  1e+85,  1e+86,  1e+87,  1e+88,  1e+89,
81*9356374aSAndroid Build Coastguard Worker     1e+90,  1e+91,  1e+92,  1e+93,  1e+94,  1e+95,  1e+96,  1e+97,  1e+98,
82*9356374aSAndroid Build Coastguard Worker     1e+99,  1e+100, 1e+101, 1e+102, 1e+103, 1e+104, 1e+105, 1e+106, 1e+107,
83*9356374aSAndroid Build Coastguard Worker     1e+108, 1e+109, 1e+110, 1e+111, 1e+112, 1e+113, 1e+114, 1e+115, 1e+116,
84*9356374aSAndroid Build Coastguard Worker     1e+117, 1e+118, 1e+119, 1e+120, 1e+121, 1e+122, 1e+123, 1e+124, 1e+125,
85*9356374aSAndroid Build Coastguard Worker     1e+126, 1e+127, 1e+128, 1e+129, 1e+130, 1e+131, 1e+132, 1e+133, 1e+134,
86*9356374aSAndroid Build Coastguard Worker     1e+135, 1e+136, 1e+137, 1e+138, 1e+139, 1e+140, 1e+141, 1e+142, 1e+143,
87*9356374aSAndroid Build Coastguard Worker     1e+144, 1e+145, 1e+146, 1e+147, 1e+148, 1e+149, 1e+150, 1e+151, 1e+152,
88*9356374aSAndroid Build Coastguard Worker     1e+153, 1e+154, 1e+155, 1e+156, 1e+157, 1e+158, 1e+159, 1e+160, 1e+161,
89*9356374aSAndroid Build Coastguard Worker     1e+162, 1e+163, 1e+164, 1e+165, 1e+166, 1e+167, 1e+168, 1e+169, 1e+170,
90*9356374aSAndroid Build Coastguard Worker     1e+171, 1e+172, 1e+173, 1e+174, 1e+175, 1e+176, 1e+177, 1e+178, 1e+179,
91*9356374aSAndroid Build Coastguard Worker     1e+180, 1e+181, 1e+182, 1e+183, 1e+184, 1e+185, 1e+186, 1e+187, 1e+188,
92*9356374aSAndroid Build Coastguard Worker     1e+189, 1e+190, 1e+191, 1e+192, 1e+193, 1e+194, 1e+195, 1e+196, 1e+197,
93*9356374aSAndroid Build Coastguard Worker     1e+198, 1e+199, 1e+200, 1e+201, 1e+202, 1e+203, 1e+204, 1e+205, 1e+206,
94*9356374aSAndroid Build Coastguard Worker     1e+207, 1e+208, 1e+209, 1e+210, 1e+211, 1e+212, 1e+213, 1e+214, 1e+215,
95*9356374aSAndroid Build Coastguard Worker     1e+216, 1e+217, 1e+218, 1e+219, 1e+220, 1e+221, 1e+222, 1e+223, 1e+224,
96*9356374aSAndroid Build Coastguard Worker     1e+225, 1e+226, 1e+227, 1e+228, 1e+229, 1e+230, 1e+231, 1e+232, 1e+233,
97*9356374aSAndroid Build Coastguard Worker     1e+234, 1e+235, 1e+236, 1e+237, 1e+238, 1e+239, 1e+240, 1e+241, 1e+242,
98*9356374aSAndroid Build Coastguard Worker     1e+243, 1e+244, 1e+245, 1e+246, 1e+247, 1e+248, 1e+249, 1e+250, 1e+251,
99*9356374aSAndroid Build Coastguard Worker     1e+252, 1e+253, 1e+254, 1e+255, 1e+256, 1e+257, 1e+258, 1e+259, 1e+260,
100*9356374aSAndroid Build Coastguard Worker     1e+261, 1e+262, 1e+263, 1e+264, 1e+265, 1e+266, 1e+267, 1e+268, 1e+269,
101*9356374aSAndroid Build Coastguard Worker     1e+270, 1e+271, 1e+272, 1e+273, 1e+274, 1e+275, 1e+276, 1e+277, 1e+278,
102*9356374aSAndroid Build Coastguard Worker     1e+279, 1e+280, 1e+281, 1e+282, 1e+283, 1e+284, 1e+285, 1e+286, 1e+287,
103*9356374aSAndroid Build Coastguard Worker     1e+288, 1e+289, 1e+290, 1e+291, 1e+292, 1e+293, 1e+294, 1e+295, 1e+296,
104*9356374aSAndroid Build Coastguard Worker     1e+297, 1e+298, 1e+299, 1e+300, 1e+301, 1e+302, 1e+303, 1e+304, 1e+305,
105*9356374aSAndroid Build Coastguard Worker     1e+306, 1e+307, 1e+308,
106*9356374aSAndroid Build Coastguard Worker };
107*9356374aSAndroid Build Coastguard Worker 
108*9356374aSAndroid Build Coastguard Worker }  // namespace
109*9356374aSAndroid Build Coastguard Worker 
Pow10(int exp)110*9356374aSAndroid Build Coastguard Worker double Pow10(int exp) {
111*9356374aSAndroid Build Coastguard Worker   if (exp < -324) {
112*9356374aSAndroid Build Coastguard Worker     return 0.0;
113*9356374aSAndroid Build Coastguard Worker   } else if (exp > 308) {
114*9356374aSAndroid Build Coastguard Worker     return INFINITY;
115*9356374aSAndroid Build Coastguard Worker   } else {
116*9356374aSAndroid Build Coastguard Worker     return kPowersOfTen[exp + 324];
117*9356374aSAndroid Build Coastguard Worker   }
118*9356374aSAndroid Build Coastguard Worker }
119*9356374aSAndroid Build Coastguard Worker 
120*9356374aSAndroid Build Coastguard Worker }  // namespace strings_internal
121*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
122*9356374aSAndroid Build Coastguard Worker }  // namespace absl
123