You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
91 lines
2.9 KiB
#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 <string> |
|
|
|
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); |
|
|
|
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; } |
|
|
|
double ulp (double x, double count = 1.0) const; |
|
Interval roundOut (const Interval& x, bool roundUnderOverflow) const; |
|
double round (double d, bool upward) const; |
|
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; |
|
|
|
void FloatFormat_selfTest (void); |
|
|
|
} // tcu |
|
|
|
#endif // _TCUFLOATFORMAT_HPP
|
|
|