[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] master 2c16778 5/7: Refactor to make ensuing changes
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] master 2c16778 5/7: Refactor to make ensuing changes simpler |
Date: |
Thu, 5 Jan 2017 03:41:39 +0000 (UTC) |
branch: master
commit 2c16778442071b05f638069e8644ba557457198e
Author: Gregory W. Chicares <address@hidden>
Commit: Gregory W. Chicares <address@hidden>
Refactor to make ensuing changes simpler
---
fenv_lmi.cpp | 51 ++++++++++++++++++++++++++-------------------------
fenv_lmi_test.cpp | 6 +++---
2 files changed, 29 insertions(+), 28 deletions(-)
diff --git a/fenv_lmi.cpp b/fenv_lmi.cpp
index 4860334..bb68bc4 100644
--- a/fenv_lmi.cpp
+++ b/fenv_lmi.cpp
@@ -59,19 +59,20 @@ namespace floating_point_environment {} // doxygen
workaround.
void fenv_initialize()
{
-#if defined LMI_IEC_559
+#if defined LMI_X86
+ x87_control_word(default_x87_control_word());
+#elif defined LMI_IEC_559
fenv_t save_env;
feholdexcept(&save_env);
fesetround(FE_TONEAREST);
# if defined __MINGW32__
+ // Standard C++ provides no way to set hardware precision.
// Here is an example of a C99 7.6/9 extension that controls
- // hardware precision.
- fesetenv(FE_PC64_ENV);
+ // hardware precision for MinGW32:
+ // fesetenv(FE_PC64_ENV);
# else // !defined __MINGW32__
# error Find a platform-specific way to set hardware precision.
# endif // !defined __MINGW32__
-#elif defined LMI_X86
- x87_control_word(default_x87_control_word());
#else // Unknown compiler or platform.
# error Unknown compiler or platform.
#endif // Unknown compiler or platform.
@@ -127,16 +128,7 @@ void fenv_precision(e_ieee754_precision precision_mode)
e_ieee754_rounding fenv_rounding()
{
-#if defined LMI_IEC_559
- int z = fegetround();
- return
- (FE_TONEAREST == z) ? fe_tonearest
- : (FE_DOWNWARD == z) ? fe_downward
- : (FE_UPWARD == z) ? fe_upward
- : (FE_TOWARDZERO == z) ? fe_towardzero
- : throw std::runtime_error("Failed to determine rounding mode.")
- ;
-#elif defined __BORLANDC__
+#if defined __BORLANDC__
unsigned short int rc = (unsigned short int)(MCW_RC) & x87_control_word();
return
(RC_NEAR == rc) ? fe_tonearest
@@ -154,6 +146,15 @@ e_ieee754_rounding fenv_rounding()
: (x87_fe_towardzero == rc) ? fe_towardzero
: throw std::runtime_error("Failed to determine rounding mode.")
;
+#elif defined LMI_IEC_559
+ int z = fegetround();
+ return
+ (FE_TONEAREST == z) ? fe_tonearest
+ : (FE_DOWNWARD == z) ? fe_downward
+ : (FE_UPWARD == z) ? fe_upward
+ : (FE_TOWARDZERO == z) ? fe_towardzero
+ : throw std::runtime_error("Failed to determine rounding mode.")
+ ;
#else // Unknown compiler or platform.
# error Unknown compiler or platform.
#endif // Unknown compiler or platform.
@@ -161,16 +162,7 @@ e_ieee754_rounding fenv_rounding()
void fenv_rounding(e_ieee754_rounding rounding_mode)
{
-#if defined LMI_IEC_559
- int z =
- (fe_tonearest == rounding_mode) ? FE_TONEAREST
- : (fe_downward == rounding_mode) ? FE_DOWNWARD
- : (fe_upward == rounding_mode) ? FE_UPWARD
- : (fe_towardzero == rounding_mode) ? FE_TOWARDZERO
- : throw std::runtime_error("Failed to set rounding mode.")
- ;
- fesetround(z);
-#elif defined __BORLANDC__
+#if defined __BORLANDC__
unsigned short int z =
(fe_tonearest == rounding_mode) ? (unsigned short int)(RC_NEAR)
: (fe_downward == rounding_mode) ? (unsigned short int)(RC_DOWN)
@@ -190,6 +182,15 @@ void fenv_rounding(e_ieee754_rounding rounding_mode)
intel_control_word control_word(x87_control_word());
control_word.rc(rc);
x87_control_word(control_word.cw());
+#elif defined LMI_IEC_559
+ int z =
+ (fe_tonearest == rounding_mode) ? FE_TONEAREST
+ : (fe_downward == rounding_mode) ? FE_DOWNWARD
+ : (fe_upward == rounding_mode) ? FE_UPWARD
+ : (fe_towardzero == rounding_mode) ? FE_TOWARDZERO
+ : throw std::runtime_error("Failed to set rounding mode.")
+ ;
+ fesetround(z);
#else // Unknown compiler or platform.
# error Unknown compiler or platform.
#endif // Unknown compiler or platform.
diff --git a/fenv_lmi_test.cpp b/fenv_lmi_test.cpp
index cfc556a..3fce81e 100644
--- a/fenv_lmi_test.cpp
+++ b/fenv_lmi_test.cpp
@@ -224,6 +224,9 @@ int test_main(int, char*[])
BOOST_TEST_EQUAL( 2, rint( 2.5));
#endif // defined LMI_COMPILER_PROVIDES_RINT
+ fenv_initialize();
+ BOOST_TEST(fenv_validate());
+
std::cout
<< "Expect induced warnings exactly as predicted below,"
<< " but no test failure."
@@ -231,9 +234,6 @@ int test_main(int, char*[])
;
fenv_initialize();
- BOOST_TEST(fenv_validate());
-
- fenv_initialize();
fenv_precision(fe_dblprec);
BOOST_TEST(fenv_validate(e_fenv_indulge_0x027f));
BOOST_TEST(fenv_validate());
- [lmi-commits] [lmi] master updated (4cc9f66 -> 571924b), Greg Chicares, 2017/01/04
- [lmi-commits] [lmi] master ae3dc97 3/7: Test for x87, Greg Chicares, 2017/01/04
- [lmi-commits] [lmi] master 73e6bec 1/7: Do not indent top-level preprocessor directives, Greg Chicares, 2017/01/04
- [lmi-commits] [lmi] master ea356b1 4/7: Improve documentation, Greg Chicares, 2017/01/04
- [lmi-commits] [lmi] master 13090e1 2/7: Update reserved-name exceptions in coding rules, Greg Chicares, 2017/01/04
- [lmi-commits] [lmi] master 2c16778 5/7: Refactor to make ensuing changes simpler,
Greg Chicares <=
- [lmi-commits] [lmi] master 571924b 7/7: Drop support for an ancient non-free compiler, Greg Chicares, 2017/01/04
- [lmi-commits] [lmi] master c07baf8 6/7: Conditionalize x87 code; provide <cfenv> alternatives where possible, Greg Chicares, 2017/01/04