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