2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FBaseFloat.cpp
20 * @brief This is the implementation file for Float class.
31 #include <FBaseFloat.h>
32 #include <FBaseResult.h>
33 #include <FBaseSysLog.h>
35 namespace Tizen { namespace Base
41 FloatBitRep(float f = 0.0)
46 FloatBitRep(unsigned int i)
55 Float::Float(float value)
61 Float::Float(const Float& value)
72 Float::operator =(const Float& rhs)
82 Float::Compare(float f1, float f2)
103 Float::CompareTo(const Float& value) const
105 return(Float::Compare(this->value, value.value));
109 Float::Equals(const Object& obj) const
111 const Float* pOther = dynamic_cast <const Float*>(&obj);
118 if (Float::Compare(this->value, (*pOther).value) == 0)
129 Float::GetHashCode(void) const
131 float* pTemp = const_cast<float*> (&value);
132 int* pValue = reinterpret_cast<int*> (pTemp);
137 Float::GetHashCode(float val)
139 int* pValue = reinterpret_cast<int*> (&val);
144 Float::Parse(const String& s, float& ret)
146 wchar_t* pEnd = null;
149 SysTryReturn(NID_BASE, s.GetLength() >= 1, E_NUM_FORMAT, E_NUM_FORMAT,
150 "[%s] The length of s MUST be greater than 0.", GetErrorMessage(E_NUM_FORMAT));
153 ret = wcstof(s.GetPointer(), &pEnd);
154 SysTryReturn(NID_BASE, (!Float::Compare(pEnd[0], 0)), E_NUM_FORMAT, E_NUM_FORMAT,
155 "[%s] Float parse failed. Scan stopped at (%ls).", GetErrorMessage(E_NUM_FORMAT), pEnd);
156 SysTryReturn(NID_BASE, !((!Float::Compare(ret, HUGE_VAL) || !Float::Compare(ret, -HUGE_VAL)) && (errno != 0)),
157 E_NUM_FORMAT, E_NUM_FORMAT, "[%s] Parsed value cannot fit into a Float.", GetErrorMessage(E_NUM_FORMAT));
163 Float::ToChar(void) const
165 return static_cast<char> (value);
169 Float::ToShort(void) const
171 return static_cast<short> (value);
175 Float::ToInt(void) const
177 return static_cast<int> (value);
181 Float::ToLong(void) const
183 return static_cast<long> (value);
187 Float::ToLongLong(void) const
189 return static_cast<long long> (value);
193 Float::ToFloat(void) const
199 Float::ToDouble(void) const
201 return static_cast<double> (value);
205 Float::ToString(void) const
207 return(Float::ToString(value));
211 Float::ToString(float value)
213 const static unsigned int MAX_DIG = 7 + 3;
214 const static unsigned int FLOAT_LENGTH_MAX = __DBL_MAX_10_EXP + MAX_DIG;
216 if (Float::IsNaN(value))
218 return String(L"NaN");
220 else if (Float::IsInfinity(value))
222 return String(L"Infinity");
226 wchar_t sValue[FLOAT_LENGTH_MAX + 1] = {0, };
227 swprintf(sValue, (sizeof(sValue) / sizeof(sValue[0])), L"%g", value);
229 return String(sValue);
234 Float::ToBits(float value)
237 bitRep.value = value;
242 Float::ToFloatFromBits(int value)
250 Float::IsFinite(float value)
252 return((isfinite(value) != 0) ? true : false);
256 Float::IsInfinity(void) const
258 return(Float::IsInfinity(value));
262 Float::IsInfinity(float value)
264 return(!Float::IsFinite(value));
268 Float::IsNaN(void) const
270 return(Float::IsNaN(value));
274 Float::IsNaN(float value)
276 return((isnan(value) != 0) ? true : false);
280 Float::GetMaxValue(void)
286 Float::GetMinValue(void)