#ifndef _TCUFLOATFORMAT_HPP #define _TCUFLOATFORMAT_HPP /*------------------------------------------------------------------------- * drawElements Quality Program Tester Core * ---------------------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Adjustable-precision floating point operations. *//*--------------------------------------------------------------------*/ #include "tcuDefs.hpp" #include "tcuInterval.hpp" #include namespace tcu { enum YesNoMaybe { NO, MAYBE, YES }; class FloatFormat { public: FloatFormat (int minExp, int maxExp, int fractionBits, bool exactPrecision, YesNoMaybe hasSubnormal = MAYBE, YesNoMaybe hasInf = MAYBE, YesNoMaybe hasNaN = MAYBE); virtual ~FloatFormat() {} int getMinExp (void) const { return m_minExp; } int getMaxExp (void) const { return m_maxExp; } double getMaxValue (void) const { return m_maxValue; } int getFractionBits (void) const { return m_fractionBits; } YesNoMaybe hasInf (void) const { return m_hasInf; } YesNoMaybe hasSubnormal (void) const { return m_hasSubnormal; } virtual double ulp (double x, double count = 1.0) const; Interval roundOut (const Interval& x, bool roundUnderOverflow) const; virtual double round (double d, bool upward) const; virtual double roundOut (double d, bool upward, bool roundUnderOverflow) const; Interval convert (const Interval& x) const; std::string floatToHex (double x) const; std::string intervalToHex (const Interval& interval) const; static FloatFormat nativeFloat (void); static FloatFormat nativeDouble (void); private: int exponentShift (int exp) const; Interval clampValue (double d) const; int m_minExp; // Minimum exponent, inclusive int m_maxExp; // Maximum exponent, inclusive int m_fractionBits; // Number of fractional bits in significand YesNoMaybe m_hasSubnormal; // Does the format support denormalized numbers? YesNoMaybe m_hasInf; // Does the format support infinities? YesNoMaybe m_hasNaN; // Does the format support NaNs? bool m_exactPrecision; // Are larger precisions disallowed? double m_maxValue; // Largest representable finite value. } DE_WARN_UNUSED_TYPE; class NormalizedFormat : public FloatFormat { public: NormalizedFormat (int fractionBits); ~NormalizedFormat () {} double ulp (double x, double count = 1.0) const override; double round (double d, bool upward) const override; double roundOut (double d, bool upward, bool roundUnderOverflow) const override; } DE_WARN_UNUSED_TYPE; void FloatFormat_selfTest (void); } // tcu #endif // _TCUFLOATFORMAT_HPP