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 SysTryReturn(NID_BASE, s.GetLength() >= 1, E_NUM_FORMAT, E_NUM_FORMAT,
147 "[%s] The length of s MUST be greater than 0.", GetErrorMessage(E_NUM_FORMAT));
150 wchar_t* pEnd = null;
151 float tmpRet = wcstof(s.GetPointer(), &pEnd);
152 SysTryReturn(NID_BASE, (!Float::Compare(pEnd[0], 0)), E_NUM_FORMAT, E_NUM_FORMAT,
153 "[%s] Float parse failed. Scan stopped at (%ls).", GetErrorMessage(E_NUM_FORMAT), pEnd);
154 SysTryReturn(NID_BASE, !((!Float::Compare(tmpRet, HUGE_VAL) || !Float::Compare(tmpRet, -HUGE_VAL)) && (errno != 0)),
155 E_NUM_FORMAT, E_NUM_FORMAT, "[%s] Parsed value cannot fit into a Float.", GetErrorMessage(E_NUM_FORMAT));
162 Float::ToChar(void) const
164 return static_cast<char> (value);
168 Float::ToShort(void) const
170 return static_cast<short> (value);
174 Float::ToInt(void) const
176 return static_cast<int> (value);
180 Float::ToLong(void) const
182 return static_cast<long> (value);
186 Float::ToLongLong(void) const
188 return static_cast<long long> (value);
192 Float::ToFloat(void) const
198 Float::ToDouble(void) const
200 return static_cast<double> (value);
204 Float::ToString(void) const
206 return(Float::ToString(value));
210 Float::ToString(float value)
212 const static unsigned int MAX_DIG = 7 + 3;
213 const static unsigned int FLOAT_LENGTH_MAX = __DBL_MAX_10_EXP + MAX_DIG;
215 if (Float::IsNaN(value))
217 return String(L"NaN");
219 else if (Float::IsInfinity(value))
221 return String(L"Infinity");
225 wchar_t sValue[FLOAT_LENGTH_MAX + 1] = {0, };
226 swprintf(sValue, (sizeof(sValue) / sizeof(sValue[0])), L"%g", value);
228 return String(sValue);
233 Float::ToBits(float value)
236 bitRep.value = value;
241 Float::ToFloatFromBits(int value)
249 Float::IsFinite(float value)
251 return((isfinite(value) != 0) ? true : false);
255 Float::IsInfinity(void) const
257 return(Float::IsInfinity(value));
261 Float::IsInfinity(float value)
263 return(!Float::IsFinite(value));
267 Float::IsNaN(void) const
269 return(Float::IsNaN(value));
273 Float::IsNaN(float value)
275 return((isnan(value) != 0) ? true : false);
279 Float::GetMaxValue(void)
285 Float::GetMinValue(void)