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 32 namespace tcu 33 { 34 35 enum YesNoMaybe 36 { 37 NO, 38 MAYBE, 39 YES 40 }; 41 42 class FloatFormat 43 { 44 public: 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 getMinExp(void) const54 int getMinExp (void) const { return m_minExp; } getMaxExp(void) const55 int getMaxExp (void) const { return m_maxExp; } getMaxValue(void) const56 double getMaxValue (void) const { return m_maxValue; } getFractionBits(void) const57 int getFractionBits (void) const { return m_fractionBits; } hasInf(void) const58 YesNoMaybe hasInf (void) const { return m_hasInf; } hasSubnormal(void) const59 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 73 private: 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 87 void FloatFormat_selfTest (void); 88 89 } // tcu 90 91 #endif // _TCUFLOATFORMAT_HPP 92