#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); } // namespace tcu #endif // _TCUFLOATFORMAT_HPP