xref: /aoo4110/main/sal/inc/rtl/math.h (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #if !defined INCLUDED_RTL_MATH_H
25*b1cdbd2cSJim Jagielski #define INCLUDED_RTL_MATH_H
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "rtl/ustring.h"
28*b1cdbd2cSJim Jagielski #include "sal/types.h"
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #if defined __cplusplus
31*b1cdbd2cSJim Jagielski extern "C" {
32*b1cdbd2cSJim Jagielski #endif /* __cplusplus */
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski /** Formatting modes for rtl_math_doubleToString and rtl_math_doubleToUString
35*b1cdbd2cSJim Jagielski     and rtl_math_doubleToUStringBuffer.
36*b1cdbd2cSJim Jagielski  */
37*b1cdbd2cSJim Jagielski enum rtl_math_StringFormat
38*b1cdbd2cSJim Jagielski {
39*b1cdbd2cSJim Jagielski     /** Like sprintf() %E.
40*b1cdbd2cSJim Jagielski      */
41*b1cdbd2cSJim Jagielski     rtl_math_StringFormat_E,
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski     /** Like sprintf() %f.
44*b1cdbd2cSJim Jagielski      */
45*b1cdbd2cSJim Jagielski     rtl_math_StringFormat_F,
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski     /** Like sprintf() %G, 'F' or 'E' format is used depending on which one is
48*b1cdbd2cSJim Jagielski         more compact.
49*b1cdbd2cSJim Jagielski     */
50*b1cdbd2cSJim Jagielski     rtl_math_StringFormat_G,
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski     /** Automatic, 'F' or 'E' format is used depending on the numeric value to
53*b1cdbd2cSJim Jagielski         be formatted.
54*b1cdbd2cSJim Jagielski      */
55*b1cdbd2cSJim Jagielski     rtl_math_StringFormat_Automatic,
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski     /** @internal
58*b1cdbd2cSJim Jagielski      */
59*b1cdbd2cSJim Jagielski     rtl_math_StringFormat_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
60*b1cdbd2cSJim Jagielski };
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski /** Status for rtl_math_stringToDouble and rtl_math_uStringToDouble.
63*b1cdbd2cSJim Jagielski  */
64*b1cdbd2cSJim Jagielski enum rtl_math_ConversionStatus
65*b1cdbd2cSJim Jagielski {
66*b1cdbd2cSJim Jagielski     /** Conversion was successful.
67*b1cdbd2cSJim Jagielski      */
68*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_Ok,
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski     /** Conversion caused overflow or underflow.
71*b1cdbd2cSJim Jagielski      */
72*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_OutOfRange,
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski     /** @internal
75*b1cdbd2cSJim Jagielski      */
76*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
77*b1cdbd2cSJim Jagielski };
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski /** Rounding modes for rtl_math_round.
80*b1cdbd2cSJim Jagielski  */
81*b1cdbd2cSJim Jagielski enum rtl_math_RoundingMode
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski     /** Like HalfUp, but corrects roundoff errors, preferred.
84*b1cdbd2cSJim Jagielski      */
85*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_Corrected,
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     /** Floor of absolute value, signed return (commercial).
88*b1cdbd2cSJim Jagielski      */
89*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_Down,
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski     /** Ceil of absolute value, signed return (commercial).
92*b1cdbd2cSJim Jagielski      */
93*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_Up,
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski     /** Floor of signed value.
96*b1cdbd2cSJim Jagielski      */
97*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_Floor,
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski     /** Ceil of signed value.
100*b1cdbd2cSJim Jagielski      */
101*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_Ceiling,
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski     /** Frac <= 0.5 ? floor of abs : ceil of abs, signed return.
104*b1cdbd2cSJim Jagielski      */
105*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_HalfDown,
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     /** Frac < 0.5 ? floor of abs : ceil of abs, signed return (mathematical).
108*b1cdbd2cSJim Jagielski      */
109*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_HalfUp,
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     /** IEEE rounding mode (statistical).
112*b1cdbd2cSJim Jagielski      */
113*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_HalfEven,
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski     /** @internal
116*b1cdbd2cSJim Jagielski      */
117*b1cdbd2cSJim Jagielski     rtl_math_RoundingMode_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski /** Special decimal places constants for rtl_math_doubleToString and
121*b1cdbd2cSJim Jagielski     rtl_math_doubleToUString and rtl_math_doubleToUStringBuffer.
122*b1cdbd2cSJim Jagielski  */
123*b1cdbd2cSJim Jagielski enum rtl_math_DecimalPlaces
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski     /** Value to be used with rtl_math_StringFormat_Automatic.
126*b1cdbd2cSJim Jagielski      */
127*b1cdbd2cSJim Jagielski     rtl_math_DecimalPlaces_Max = 0x7ffffff,
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski     /** Value to be used with rtl_math_StringFormat_G.
130*b1cdbd2cSJim Jagielski         In fact the same value as rtl_math_DecimalPlaces_Max, just an alias for
131*b1cdbd2cSJim Jagielski         better understanding.
132*b1cdbd2cSJim Jagielski      */
133*b1cdbd2cSJim Jagielski     rtl_math_DecimalPlaces_DefaultSignificance = 0x7ffffff
134*b1cdbd2cSJim Jagielski };
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski /** Conversions analogous to sprintf() using internal rounding.
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski     +/-HUGE_VAL are converted to "INF" and "-INF", NAN values are
140*b1cdbd2cSJim Jagielski     converted to "NaN".
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     @param pResult
143*b1cdbd2cSJim Jagielski     Returns the resulting byte string.  Must itself not be null, and must point
144*b1cdbd2cSJim Jagielski     to either null or a valid string.
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski     @param pResultCapacity
147*b1cdbd2cSJim Jagielski     If null, pResult is considered to point to immutable strings, and a new
148*b1cdbd2cSJim Jagielski     string will be allocated in pResult.
149*b1cdbd2cSJim Jagielski     If non-null, it points to the current capacity of pResult, which is
150*b1cdbd2cSJim Jagielski     considered to point to a string buffer (pResult must not itself be null in
151*b1cdbd2cSJim Jagielski     this case, and must point to a string that has room for the given capacity).
152*b1cdbd2cSJim Jagielski     The string representation of the given double value is inserted into pResult
153*b1cdbd2cSJim Jagielski     at position nResultOffset.  If pResult's current capacity is too small, a
154*b1cdbd2cSJim Jagielski     new string buffer will be allocated in pResult as necessary, and
155*b1cdbd2cSJim Jagielski     pResultCapacity will contain the new capacity on return.
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski     @param nResultOffset
158*b1cdbd2cSJim Jagielski     If pResult is used as a string buffer (i.e., pResultCapacity is non-null),
159*b1cdbd2cSJim Jagielski     nResultOffset specifies the insertion offset within the buffer.  Ignored
160*b1cdbd2cSJim Jagielski     otherwise.
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     @param fValue
163*b1cdbd2cSJim Jagielski     The value to convert.
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     @param eFormat
166*b1cdbd2cSJim Jagielski     The format to use, one of rtl_math_StringFormat.
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski     @param nDecPlaces
169*b1cdbd2cSJim Jagielski     The number of decimals to be generated.  Effectively fValue is rounded at
170*b1cdbd2cSJim Jagielski     this position, specifying nDecPlaces <= 0 accordingly rounds the value
171*b1cdbd2cSJim Jagielski     before the decimal point and fills with zeros.
172*b1cdbd2cSJim Jagielski     If eFormat == rtl_math_StringFormat_Automatic and nDecPlaces ==
173*b1cdbd2cSJim Jagielski     rtl_math_DecimalPlaces_Max, the highest number of significant decimals
174*b1cdbd2cSJim Jagielski     possible is generated.
175*b1cdbd2cSJim Jagielski     If eFormat == rtl_math_StringFormat_G, nDecPlaces specifies the number of
176*b1cdbd2cSJim Jagielski     significant digits instead.  If nDecPlaces ==
177*b1cdbd2cSJim Jagielski     rtl_math_DecimalPlaces_DefaultSignificance, the default number (currently 6
178*b1cdbd2cSJim Jagielski     as implemented by most libraries) of significant digits is generated.
179*b1cdbd2cSJim Jagielski     According to the ANSI C90 standard the E style will be used only if the
180*b1cdbd2cSJim Jagielski     exponent resulting from the conversion is less than -4 or greater than or
181*b1cdbd2cSJim Jagielski     equal to the precision.  However, as opposed to the ANSI standard, trailing
182*b1cdbd2cSJim Jagielski     zeros are not necessarily removed from the fractional portion of the result
183*b1cdbd2cSJim Jagielski     unless bEraseTrailingDecZeros == true was specified.
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     @param cDecSeparator
186*b1cdbd2cSJim Jagielski     The decimal separator.
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski     @param pGroups
189*b1cdbd2cSJim Jagielski     Either null (no grouping is used), or a null-terminated list of group
190*b1cdbd2cSJim Jagielski     lengths.  Each group length must be strictly positive.  If the number of
191*b1cdbd2cSJim Jagielski     digits in a conversion exceeds the specified range, the last (highest) group
192*b1cdbd2cSJim Jagielski     length is repeated as needed.  Values are applied from right to left, for a
193*b1cdbd2cSJim Jagielski     grouping of 1,00,00,000 you'd have to specify pGroups={3,2,0}.
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski     @param cGroupSeparator
196*b1cdbd2cSJim Jagielski     The group separator.  Ignored if pGroups is null.
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski     @param bEraseTrailingDecZeros
199*b1cdbd2cSJim Jagielski     Trailing zeros in decimal places are erased.
200*b1cdbd2cSJim Jagielski  */
201*b1cdbd2cSJim Jagielski void SAL_CALL rtl_math_doubleToString(rtl_String ** pResult,
202*b1cdbd2cSJim Jagielski                                       sal_Int32 * pResultCapacity,
203*b1cdbd2cSJim Jagielski                                       sal_Int32 nResultOffset, double fValue,
204*b1cdbd2cSJim Jagielski                                       enum rtl_math_StringFormat eFormat,
205*b1cdbd2cSJim Jagielski                                       sal_Int32 nDecPlaces,
206*b1cdbd2cSJim Jagielski                                       sal_Char cDecSeparator,
207*b1cdbd2cSJim Jagielski                                       sal_Int32 const * pGroups,
208*b1cdbd2cSJim Jagielski                                       sal_Char cGroupSeparator,
209*b1cdbd2cSJim Jagielski                                       sal_Bool bEraseTrailingDecZeros)
210*b1cdbd2cSJim Jagielski     SAL_THROW_EXTERN_C();
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski /** Conversions analogous to sprintf() using internal rounding.
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski     +/-HUGE_VAL are converted to "INF" and "-INF", NAN values are
215*b1cdbd2cSJim Jagielski     converted to "NaN".
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski     @param pResult
218*b1cdbd2cSJim Jagielski     Returns the resulting Unicode string.  Must itself not be null, and must
219*b1cdbd2cSJim Jagielski     point to either null or a valid string.
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski     @param pResultCapacity
222*b1cdbd2cSJim Jagielski     If null, pResult is considered to point to immutable strings, and a new
223*b1cdbd2cSJim Jagielski     string will be allocated in pResult.
224*b1cdbd2cSJim Jagielski     If non-null, it points to the current capacity of pResult, which is
225*b1cdbd2cSJim Jagielski     considered to point to a string buffer (pResult must not itself be null in
226*b1cdbd2cSJim Jagielski     this case, and must point to a string that has room for the given capacity).
227*b1cdbd2cSJim Jagielski     The string representation of the given double value is inserted into pResult
228*b1cdbd2cSJim Jagielski     at position nResultOffset.  If pResult's current capacity is too small, a
229*b1cdbd2cSJim Jagielski     new string buffer will be allocated in pResult as necessary, and
230*b1cdbd2cSJim Jagielski     pResultCapacity will contain the new capacity on return.
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski     @param nResultOffset
233*b1cdbd2cSJim Jagielski     If pResult is used as a string buffer (i.e., pResultCapacity is non-null),
234*b1cdbd2cSJim Jagielski     nResultOffset specifies the insertion offset within the buffer.  Ignored
235*b1cdbd2cSJim Jagielski     otherwise.
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski     @param fValue
238*b1cdbd2cSJim Jagielski     The value to convert.
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski     @param eFormat
241*b1cdbd2cSJim Jagielski     The format to use, one of rtl_math_StringFormat.
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski     @param nDecPlaces
244*b1cdbd2cSJim Jagielski     The number of decimals to be generated.  Effectively fValue is rounded at
245*b1cdbd2cSJim Jagielski     this position, specifying nDecPlaces <= 0 accordingly rounds the value
246*b1cdbd2cSJim Jagielski     before the decimal point and fills with zeros.
247*b1cdbd2cSJim Jagielski     If eFormat == rtl_math_StringFormat_Automatic and nDecPlaces ==
248*b1cdbd2cSJim Jagielski     rtl_math_DecimalPlaces_Max, the highest number of significant decimals
249*b1cdbd2cSJim Jagielski     possible is generated.
250*b1cdbd2cSJim Jagielski     If eFormat == rtl_math_StringFormat_G, nDecPlaces specifies the number of
251*b1cdbd2cSJim Jagielski     significant digits instead.  If nDecPlaces ==
252*b1cdbd2cSJim Jagielski     rtl_math_DecimalPlaces_DefaultSignificance, the default number (currently 6
253*b1cdbd2cSJim Jagielski     as implemented by most libraries) of significant digits is generated.
254*b1cdbd2cSJim Jagielski     According to the ANSI C90 standard the E style will be used only if the
255*b1cdbd2cSJim Jagielski     exponent resulting from the conversion is less than -4 or greater than or
256*b1cdbd2cSJim Jagielski     equal to the precision.  However, as opposed to the ANSI standard, trailing
257*b1cdbd2cSJim Jagielski     zeros are not necessarily removed from the fractional portion of the result
258*b1cdbd2cSJim Jagielski     unless bEraseTrailingDecZeros == true was specified.
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski     @param cDecSeparator
261*b1cdbd2cSJim Jagielski     The decimal separator.
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski     @param pGroups
264*b1cdbd2cSJim Jagielski     Either null (no grouping is used), or a null-terminated list of group
265*b1cdbd2cSJim Jagielski     lengths.  Each group length must be strictly positive.  If the number of
266*b1cdbd2cSJim Jagielski     digits in a conversion exceeds the specified range, the last (highest) group
267*b1cdbd2cSJim Jagielski     length is repeated as needed.  Values are applied from right to left, for a
268*b1cdbd2cSJim Jagielski     grouping of 1,00,00,000 you'd have to specify pGroups={3,2,0}.
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski     @param cGroupSeparator
271*b1cdbd2cSJim Jagielski     The group separator.  Ignored if pGroups is null.
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski     @param bEraseTrailingDecZeros
274*b1cdbd2cSJim Jagielski     Trailing zeros in decimal places are erased.
275*b1cdbd2cSJim Jagielski  */
276*b1cdbd2cSJim Jagielski void SAL_CALL rtl_math_doubleToUString(rtl_uString ** pResult,
277*b1cdbd2cSJim Jagielski                                        sal_Int32 * pResultCapacity,
278*b1cdbd2cSJim Jagielski                                        sal_Int32 nResultOffset, double fValue,
279*b1cdbd2cSJim Jagielski                                        enum rtl_math_StringFormat eFormat,
280*b1cdbd2cSJim Jagielski                                        sal_Int32 nDecPlaces,
281*b1cdbd2cSJim Jagielski                                        sal_Unicode cDecSeparator,
282*b1cdbd2cSJim Jagielski                                        sal_Int32 const * pGroups,
283*b1cdbd2cSJim Jagielski                                        sal_Unicode cGroupSeparator,
284*b1cdbd2cSJim Jagielski                                        sal_Bool bEraseTrailingDecZeros)
285*b1cdbd2cSJim Jagielski     SAL_THROW_EXTERN_C();
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski /** Conversion analogous to strtod(), convert a string representing a
288*b1cdbd2cSJim Jagielski     decimal number into a double value.
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski     Leading tabs (0x09) and spaces (0x20) are eaten.  Overflow returns
291*b1cdbd2cSJim Jagielski     +/-HUGE_VAL, underflow 0.  In both cases pStatus is set to
292*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_OutOfRange, otherwise to
293*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_Ok.  "INF", "-INF" and "+/-1.#INF" are
294*b1cdbd2cSJim Jagielski     recognized as +/-HUGE_VAL, pStatus is set to
295*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_OutOfRange.  "NaN" and "+/-1.#NAN" are
296*b1cdbd2cSJim Jagielski     recognized and the value is set to +/-NAN, pStatus is set to
297*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_Ok.
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski     @param pBegin
300*b1cdbd2cSJim Jagielski     Points to the start of the byte string to convert.  Must not be null.
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski     @param pEnd
303*b1cdbd2cSJim Jagielski     Points one past the end of the byte string to convert.  The condition
304*b1cdbd2cSJim Jagielski     pEnd >= pBegin must hold.
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     @param cDecSeparator
307*b1cdbd2cSJim Jagielski     The decimal separator.
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     @param cGroupSeparator
310*b1cdbd2cSJim Jagielski     The group (aka thousands) separator.
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski     @param pStatus
313*b1cdbd2cSJim Jagielski     If non-null, returns the status of the conversion.
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski     @param pParsedEnd
316*b1cdbd2cSJim Jagielski     If non-null, returns one past the position of the last character parsed
317*b1cdbd2cSJim Jagielski     away.  Thus if [pBegin..pEnd) only contains the numerical string to be
318*b1cdbd2cSJim Jagielski     parsed, *pParsedEnd == pEnd on return.  If no numerical (sub-)string is
319*b1cdbd2cSJim Jagielski     found, *pParsedEnd == pBegin on return, even if there was leading
320*b1cdbd2cSJim Jagielski     whitespace.
321*b1cdbd2cSJim Jagielski  */
322*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_stringToDouble(
323*b1cdbd2cSJim Jagielski     sal_Char const * pBegin, sal_Char const * pEnd, sal_Char cDecSeparator,
324*b1cdbd2cSJim Jagielski     sal_Char cGroupSeparator, enum rtl_math_ConversionStatus * pStatus,
325*b1cdbd2cSJim Jagielski     sal_Char const ** pParsedEnd) SAL_THROW_EXTERN_C();
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski /** Conversion analogous to strtod(), convert a string representing a
328*b1cdbd2cSJim Jagielski     decimal number into a double value.
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski     Leading tabs (U+0009) and spaces (U+0020) are eaten.  Overflow returns
331*b1cdbd2cSJim Jagielski     +/-HUGE_VAL, underflow 0.  In both cases pStatus is set to
332*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_OutOfRange, otherwise to
333*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_Ok.  "INF", "-INF" and "+/-1.#INF" are
334*b1cdbd2cSJim Jagielski     recognized as +/-HUGE_VAL, pStatus is set to
335*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_OutOfRange.  "NaN" and "+/-1.#NAN" are
336*b1cdbd2cSJim Jagielski     recognized and the value is set to +/-NAN, pStatus is set to
337*b1cdbd2cSJim Jagielski     rtl_math_ConversionStatus_Ok.
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     @param pBegin
340*b1cdbd2cSJim Jagielski     Points to the start of the Unicode string to convert.  Must not be null.
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski     @param pEnd
343*b1cdbd2cSJim Jagielski     Points one past the end of the Unicode string to convert.  The condition
344*b1cdbd2cSJim Jagielski     pEnd >= pBegin must hold.
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski     @param cDecSeparator
347*b1cdbd2cSJim Jagielski     The decimal separator.
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski     @param cGroupSeparator
350*b1cdbd2cSJim Jagielski     The group (aka thousands) separator.
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski     @param pStatus
353*b1cdbd2cSJim Jagielski     If non-null, returns the status of the conversion.
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski     @param pParsedEnd
356*b1cdbd2cSJim Jagielski     If non-null, returns one past the position of the last character parsed
357*b1cdbd2cSJim Jagielski     away.  Thus if [pBegin..pEnd) only contains the numerical string to be
358*b1cdbd2cSJim Jagielski     parsed, *pParsedEnd == pEnd on return.  If no numerical (sub-)string is
359*b1cdbd2cSJim Jagielski     found, *pParsedEnd == pBegin on return, even if there was leading
360*b1cdbd2cSJim Jagielski     whitespace.
361*b1cdbd2cSJim Jagielski  */
362*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_uStringToDouble(
363*b1cdbd2cSJim Jagielski     sal_Unicode const * pBegin, sal_Unicode const * pEnd,
364*b1cdbd2cSJim Jagielski     sal_Unicode cDecSeparator, sal_Unicode cGroupSeparator,
365*b1cdbd2cSJim Jagielski     enum rtl_math_ConversionStatus * pStatus, sal_Unicode const ** pParsedEnd)
366*b1cdbd2cSJim Jagielski     SAL_THROW_EXTERN_C();
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski /** Rounds a double value.
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski     @param fValue
371*b1cdbd2cSJim Jagielski     Specifies the value to be rounded.
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski     @param nDecPlaces
374*b1cdbd2cSJim Jagielski     Specifies the decimal place where rounding occurs.  Must be in the range
375*b1cdbd2cSJim Jagielski     -20 to +20, inclusive.  Negative if rounding occurs before the decimal
376*b1cdbd2cSJim Jagielski     point.
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski     @param eMode
379*b1cdbd2cSJim Jagielski     Specifies the rounding mode.
380*b1cdbd2cSJim Jagielski  */
381*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_round(double fValue, int nDecPlaces,
382*b1cdbd2cSJim Jagielski                                enum rtl_math_RoundingMode eMode)
383*b1cdbd2cSJim Jagielski     SAL_THROW_EXTERN_C();
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski /** Scales fVal to a power of 10 without calling pow() or div() for nExp values
386*b1cdbd2cSJim Jagielski     between -16 and +16, providing a faster method.
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski     @param fValue
389*b1cdbd2cSJim Jagielski     The value to be raised.
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski     @param nExp
392*b1cdbd2cSJim Jagielski     The exponent.
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski     @return
395*b1cdbd2cSJim Jagielski     fVal * pow(10.0, nExp)
396*b1cdbd2cSJim Jagielski  */
397*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_pow10Exp(double fValue, int nExp) SAL_THROW_EXTERN_C();
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski /** Rounds value to 15 significant decimal digits.
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski     @param fValue
402*b1cdbd2cSJim Jagielski     The value to be rounded.
403*b1cdbd2cSJim Jagielski   */
404*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_approxValue(double fValue) SAL_THROW_EXTERN_C();
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski /** Returns more accurate e^x-1 for x near 0 than calculating directly.
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski     expm1 is part of the C99 standard, but not provided by some compilers.
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski     @param fValue
411*b1cdbd2cSJim Jagielski     The value x in the term e^x-1.
412*b1cdbd2cSJim Jagielski   */
413*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_expm1(double fValue) SAL_THROW_EXTERN_C();
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski /** Returns more accurate log(1+x) for x near 0 than calculating directly.
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski     log1p is part of the C99 standard, but not provided by some compilers.
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski     @param fValue
420*b1cdbd2cSJim Jagielski     The value x in the term log(1+x).
421*b1cdbd2cSJim Jagielski   */
422*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_log1p(double fValue) SAL_THROW_EXTERN_C();
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski /** Returns more accurate atanh(x) for x near 0 than calculating
425*b1cdbd2cSJim Jagielski     0.5*log((1+x)/(1-x)).
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski     atanh is part of the C99 standard, but not provided by some compilers.
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski     @param fValue
430*b1cdbd2cSJim Jagielski     The value x in the term atanh(x).
431*b1cdbd2cSJim Jagielski   */
432*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_atanh(double fValue) SAL_THROW_EXTERN_C();
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski /** Returns values of the Errorfunction erf.
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski     erf is part of the C99 standard, but not provided by some compilers.
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski     @param fValue
439*b1cdbd2cSJim Jagielski     The value x in the term erf(x).
440*b1cdbd2cSJim Jagielski   */
441*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_erf(double fValue) SAL_THROW_EXTERN_C();
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski /** Returns values of the complement Errorfunction erfc.
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     erfc is part of the C99 standard, but not provided by some compilers.
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski     @param fValue
448*b1cdbd2cSJim Jagielski     The value x in the term erfc(x).
449*b1cdbd2cSJim Jagielski   */
450*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_erfc(double fValue) SAL_THROW_EXTERN_C();
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski /** Returns values of the inverse hyperbolic sine.
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski     asinh is part of the C99 standard, but not provided by some compilers.
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski     @param fValue
457*b1cdbd2cSJim Jagielski     The value x in the term asinh(x).
458*b1cdbd2cSJim Jagielski   */
459*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_asinh(double fValue) SAL_THROW_EXTERN_C();
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski /** Returns values of the inverse hyperbolic cosine.
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski     acosh is part of the C99 standard, but not provided by some compilers.
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski     @param fValue
466*b1cdbd2cSJim Jagielski     The value x in the term acosh(x).
467*b1cdbd2cSJim Jagielski   */
468*b1cdbd2cSJim Jagielski double SAL_CALL rtl_math_acosh(double fValue) SAL_THROW_EXTERN_C();
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski #if defined __cplusplus
471*b1cdbd2cSJim Jagielski }
472*b1cdbd2cSJim Jagielski #endif /* __cplusplus */
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski #endif /* INCLUDED_RTL_MATH_H */
475