1#ifndef _TCUFLOATFORMAT_HPP 2#define _TCUFLOATFORMAT_HPP 3/*------------------------------------------------------------------------- 4 * drawElements Quality Program Tester Core 5 * ---------------------------------------- 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Adjustable-precision floating point operations. 24 *//*--------------------------------------------------------------------*/ 25 26#include "tcuDefs.hpp" 27 28#include "tcuInterval.hpp" 29 30#include <string> 31 32namespace tcu 33{ 34 35enum YesNoMaybe 36{ 37 NO, 38 MAYBE, 39 YES 40}; 41 42class FloatFormat 43{ 44public: 45 46 FloatFormat (int minExp, 47 int maxExp, 48 int fractionBits, 49 bool exactPrecision, 50 YesNoMaybe hasSubnormal = MAYBE, 51 YesNoMaybe hasInf = MAYBE, 52 YesNoMaybe hasNaN = MAYBE); 53 54 int getMinExp (void) const { return m_minExp; } 55 int getMaxExp (void) const { return m_maxExp; } 56 double getMaxValue (void) const { return m_maxValue; } 57 int getFractionBits (void) const { return m_fractionBits; } 58 YesNoMaybe hasInf (void) const { return m_hasInf; } 59 YesNoMaybe hasSubnormal (void) const { return m_hasSubnormal; } 60 61 double ulp (double x, double count = 1.0) const; 62 Interval roundOut (const Interval& x, bool roundUnderOverflow) const; 63 double round (double d, bool upward) const; 64 double roundOut (double d, bool upward, bool roundUnderOverflow) const; 65 Interval convert (const Interval& x) const; 66 67 std::string floatToHex (double x) const; 68 std::string intervalToHex (const Interval& interval) const; 69 70 static FloatFormat nativeFloat (void); 71 static FloatFormat nativeDouble (void); 72 73private: 74 int exponentShift (int exp) const; 75 Interval clampValue (double d) const; 76 77 int m_minExp; // Minimum exponent, inclusive 78 int m_maxExp; // Maximum exponent, inclusive 79 int m_fractionBits; // Number of fractional bits in significand 80 YesNoMaybe m_hasSubnormal; // Does the format support denormalized numbers? 81 YesNoMaybe m_hasInf; // Does the format support infinities? 82 YesNoMaybe m_hasNaN; // Does the format support NaNs? 83 bool m_exactPrecision; // Are larger precisions disallowed? 84 double m_maxValue; // Largest representable finite value. 85} DE_WARN_UNUSED_TYPE; 86 87void FloatFormat_selfTest (void); 88 89} // tcu 90 91#endif // _TCUFLOATFORMAT_HPP 92