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