1 /* Declaration of Rounding_Dir and related functions. 2 Copyright (C) 2001-2010 Roberto Bagnara <bagnara@cs.unipr.it> 3 Copyright (C) 2010-2016 BUGSENG srl (http://bugseng.com) 4 5 This file is part of the Parma Polyhedra Library (PPL). 6 7 The PPL is free software; you can redistribute it and/or modify it 8 under the terms of the GNU General Public License as published by the 9 Free Software Foundation; either version 3 of the License, or (at your 10 option) any later version. 11 12 The PPL is distributed in the hope that it will be useful, but WITHOUT 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software Foundation, 19 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. 20 21 For the most up-to-date information see the Parma Polyhedra Library 22 site: http://bugseng.com/products/ppl/ . */ 23 24 #ifndef PPL_Rounding_defs_hh 25 #define PPL_Rounding_defs_hh 1 26 27 #include "Result_defs.hh" 28 #include "fpu_defs.hh" 29 30 namespace Parma_Polyhedra_Library { 31 32 //! Rounding directions for arithmetic computations. 33 /*! \ingroup PPL_CXX_interface */ 34 enum Rounding_Dir { 35 /*! \hideinitializer 36 Round toward \f$-\infty\f$. 37 */ 38 ROUND_DOWN = 0U, 39 40 /*! \hideinitializer 41 Round toward \f$+\infty\f$. 42 */ 43 ROUND_UP = 1U, 44 45 /*! \hideinitializer 46 Rounding is delegated to lower level. Result info is evaluated lazily. 47 */ 48 ROUND_IGNORE = 6U, 49 ROUND_NATIVE = ROUND_IGNORE, 50 51 /*! \hideinitializer 52 Rounding is not needed: client code must ensure that the operation 53 result is exact and representable in the destination type. 54 Result info is evaluated lazily. 55 */ 56 ROUND_NOT_NEEDED = 7U, 57 58 ROUND_DIRECT = ROUND_UP, 59 ROUND_INVERSE = ROUND_DOWN, 60 61 ROUND_DIR_MASK = 7U, 62 63 /*! \hideinitializer 64 The client code is willing to pay an extra price to know the exact 65 relation between the exact result and the computed one. 66 */ 67 ROUND_STRICT_RELATION = 8U, 68 69 ROUND_CHECK = ROUND_DIRECT | ROUND_STRICT_RELATION 70 }; 71 72 //! \name Functions Inspecting and/or Combining Rounding_Dir Values 73 //@{ 74 75 /*! \ingroup PPL_CXX_interface */ 76 Rounding_Dir operator&(Rounding_Dir x, Rounding_Dir y); 77 78 /*! \ingroup PPL_CXX_interface */ 79 Rounding_Dir operator|(Rounding_Dir x, Rounding_Dir y); 80 81 /*! \ingroup PPL_CXX_interface \brief 82 Returns the inverse rounding mode of \p dir, 83 <CODE>ROUND_IGNORE</CODE> being the inverse of itself. 84 */ 85 Rounding_Dir inverse(Rounding_Dir dir); 86 87 /*! \ingroup PPL_CXX_interface */ 88 Rounding_Dir round_dir(Rounding_Dir dir); 89 90 /*! \ingroup PPL_CXX_interface */ 91 bool round_down(Rounding_Dir dir); 92 93 /*! \ingroup PPL_CXX_interface */ 94 bool round_up(Rounding_Dir dir); 95 96 /*! \ingroup PPL_CXX_interface */ 97 bool round_ignore(Rounding_Dir dir); 98 99 /*! \ingroup PPL_CXX_interface */ 100 bool round_not_needed(Rounding_Dir dir); 101 102 /*! \ingroup PPL_CXX_interface */ 103 bool round_not_requested(Rounding_Dir dir); 104 105 /*! \ingroup PPL_CXX_interface */ 106 bool round_direct(Rounding_Dir dir); 107 108 /*! \ingroup PPL_CXX_interface */ 109 bool round_inverse(Rounding_Dir dir); 110 111 /*! \ingroup PPL_CXX_interface */ 112 bool round_strict_relation(Rounding_Dir dir); 113 114 /*! \ingroup PPL_CXX_interface */ 115 fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir); 116 117 //@} // Functions Inspecting and/or Combining Rounding_Dir Values 118 119 } // namespace Parma_Polyhedra_Library 120 121 #include "Rounding_Dir_inlines.hh" 122 123 #endif // !defined(PPL_Float_defs_hh) 124 125