diff --git a/inst/include/current/armadillo_bits/diskio_bones.hpp b/inst/include/current/armadillo_bits/diskio_bones.hpp index 99b685fa..05ad1419 100644 --- a/inst/include/current/armadillo_bits/diskio_bones.hpp +++ b/inst/include/current/armadillo_bits/diskio_bones.hpp @@ -63,6 +63,9 @@ struct diskio template inline static std::streamsize prepare_stream(std::ostream& f); + template inline static constexpr eT real_as_int_lower_limit(); + template inline static constexpr eT real_as_int_upper_limit(); + // // matrix saving diff --git a/inst/include/current/armadillo_bits/diskio_meat.hpp b/inst/include/current/armadillo_bits/diskio_meat.hpp index 02ed4a98..22c98faa 100644 --- a/inst/include/current/armadillo_bits/diskio_meat.hpp +++ b/inst/include/current/armadillo_bits/diskio_meat.hpp @@ -688,7 +688,32 @@ diskio::prepare_stream(std::ostream& f) return cell_width; } + + + +template +inline +constexpr +eT +diskio::real_as_int_lower_limit() + { + constexpr eT eT_int_accuracy_lower_limit = -( (is_fp16::value) ? eT(0x800) : ( (is_float::value) ? eT(0x1000000) : eT(0x20000000000000) ) ); + return (std::max)( eT(std::numeric_limits::lowest()), eT_int_accuracy_lower_limit ); + } + + + +template +inline +constexpr +eT +diskio::real_as_int_upper_limit() + { + constexpr eT eT_int_accuracy_upper_limit = (is_fp16::value) ? eT(0x800) : ( (is_float::value) ? eT(0x1000000) : eT(0x20000000000000) ); + + return (std::min)( eT(std::numeric_limits::max()), eT_int_accuracy_upper_limit ); + } @@ -935,8 +960,8 @@ diskio::save_csv_ascii(const Mat& x, std::ostream& f, const char separator) uword x_n_rows = x.n_rows; uword x_n_cols = x.n_cols; - const eT eT_int_lowest = eT(std::numeric_limits::lowest()); - const eT eT_int_max = eT(std::numeric_limits::max()); + constexpr eT eT_int_lower = diskio::real_as_int_lower_limit(); + constexpr eT eT_int_upper = diskio::real_as_int_upper_limit(); for(uword row=0; row < x_n_rows; ++row) { @@ -944,7 +969,7 @@ diskio::save_csv_ascii(const Mat& x, std::ostream& f, const char separator) { const eT val = x.at(row,col); - const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lowest) && (val < eT_int_max) && (eT(int(val)) == val); + const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lower) && (val < eT_int_upper) && (eT(int(val)) == val); (is_real_int) ? arma_ostream::raw_print_elem(f, int(val)) : arma_ostream::raw_print_elem(f, val); @@ -977,8 +1002,8 @@ diskio::save_csv_ascii(const Mat< std::complex >& x, std::ostream& f, const c diskio::prepare_stream(f); - const T T_int_lowest = T(std::numeric_limits::lowest()); - const T T_int_max = T(std::numeric_limits::max()); + constexpr T T_int_lower = diskio::real_as_int_lower_limit(); + constexpr T T_int_upper = diskio::real_as_int_upper_limit(); uword x_n_rows = x.n_rows; uword x_n_cols = x.n_cols; @@ -994,8 +1019,8 @@ diskio::save_csv_ascii(const Mat< std::complex >& x, std::ostream& f, const c const T abs_i = (val_i < T(0)) ? T(-val_i) : T(val_i); const char sgn_i = (val_i < T(0)) ? char('-') : char('+'); - const bool val_r_is_real_int = (is_real::yes) && arma_isfinite(val_r) && (val_r > T_int_lowest) && (val_r < T_int_max) && (T(int(val_r)) == val_r); - const bool abs_i_is_real_int = (is_real::yes) && arma_isfinite(abs_i) && (abs_i < T_int_max) && (T(int(abs_i)) == abs_i); + const bool val_r_is_real_int = (is_real::yes) && arma_isfinite(val_r) && (val_r > T_int_lower) && (val_r < T_int_upper) && (T(int(val_r)) == val_r); + const bool abs_i_is_real_int = (is_real::yes) && arma_isfinite(abs_i) && (abs_i < T_int_upper) && (T(int(abs_i)) == abs_i); (val_r_is_real_int) ? arma_ostream::raw_print_elem(f, int(val_r)) : arma_ostream::raw_print_elem(f, val_r); @@ -1061,9 +1086,9 @@ diskio::save_coord_ascii(const Mat& x, std::ostream& f) diskio::prepare_stream(f); - const eT eT_zero = eT(0); - const eT eT_int_lowest = eT(std::numeric_limits::lowest()); - const eT eT_int_max = eT(std::numeric_limits::max()); + constexpr eT eT_zero = eT(0); + constexpr eT eT_int_lower = diskio::real_as_int_lower_limit(); + constexpr eT eT_int_upper = diskio::real_as_int_upper_limit(); for(uword col=0; col < x.n_cols; ++col) for(uword row=0; row < x.n_rows; ++row) @@ -1075,7 +1100,7 @@ diskio::save_coord_ascii(const Mat& x, std::ostream& f) f << row; f.put(' '); f << col; f.put(' '); - const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lowest) && (val < eT_int_max) && (eT(int(val)) == val); + const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lower) && (val < eT_int_upper) && (eT(int(val)) == val); (is_real_int) ? arma_ostream::raw_print_elem(f, int(val)) : arma_ostream::raw_print_elem(f, val); @@ -1116,9 +1141,9 @@ diskio::save_coord_ascii(const Mat< std::complex >& x, std::ostream& f) diskio::prepare_stream(f); - const eT eT_zero = eT(0); - const T T_int_lowest = T(std::numeric_limits::lowest()); - const T T_int_max = T(std::numeric_limits::max()); + constexpr eT eT_zero = eT(0); + constexpr T T_int_lower = diskio::real_as_int_lower_limit(); + constexpr T T_int_upper = diskio::real_as_int_upper_limit(); for(uword col=0; col < x.n_cols; ++col) for(uword row=0; row < x.n_rows; ++row) @@ -1133,8 +1158,8 @@ diskio::save_coord_ascii(const Mat< std::complex >& x, std::ostream& f) const T val_r = std::real(val); const T val_i = std::imag(val); - const bool val_r_is_real_int = (is_real::yes) && arma_isfinite(val_r) && (val_r > T_int_lowest) && (val_r < T_int_max) && (T(int(val_r)) == val_r); - const bool val_i_is_real_int = (is_real::yes) && arma_isfinite(val_i) && (val_i > T_int_lowest) && (val_i < T_int_max) && (T(int(val_i)) == val_i); + const bool val_r_is_real_int = (is_real::yes) && arma_isfinite(val_r) && (val_r > T_int_lower) && (val_r < T_int_upper) && (T(int(val_r)) == val_r); + const bool val_i_is_real_int = (is_real::yes) && arma_isfinite(val_i) && (val_i > T_int_lower) && (val_i < T_int_upper) && (T(int(val_i)) == val_i); (val_r_is_real_int) ? arma_ostream::raw_print_elem(f, int(val_r)) : arma_ostream::raw_print_elem(f, val_r); @@ -2966,9 +2991,9 @@ diskio::save_csv_ascii(const SpMat& x, std::ostream& f, const char separator uword x_n_rows = x.n_rows; uword x_n_cols = x.n_cols; - const eT eT_zero = eT(0); - const eT eT_int_lowest = eT(std::numeric_limits::lowest()); - const eT eT_int_max = eT(std::numeric_limits::max()); + constexpr eT eT_zero = eT(0); + constexpr eT eT_int_lower = diskio::real_as_int_lower_limit(); + constexpr eT eT_int_upper = diskio::real_as_int_upper_limit(); for(uword row=0; row < x_n_rows; ++row) { @@ -2982,7 +3007,7 @@ diskio::save_csv_ascii(const SpMat& x, std::ostream& f, const char separator } else { - const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lowest) && (val < eT_int_max) && (eT(int(val)) == val); + const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lower) && (val < eT_int_upper) && (eT(int(val)) == val); (is_real_int) ? arma_ostream::raw_print_elem(f, int(val)) : arma_ostream::raw_print_elem(f, val); } @@ -3064,8 +3089,8 @@ diskio::save_coord_ascii(const SpMat& x, std::ostream& f) diskio::prepare_stream(f); - const eT eT_int_lowest = eT(std::numeric_limits::lowest()); - const eT eT_int_max = eT(std::numeric_limits::max()); + constexpr eT eT_int_lower = diskio::real_as_int_lower_limit(); + constexpr eT eT_int_upper = diskio::real_as_int_upper_limit(); typename SpMat::const_iterator iter = x.begin(); typename SpMat::const_iterator iter_end = x.end(); @@ -3077,7 +3102,7 @@ diskio::save_coord_ascii(const SpMat& x, std::ostream& f) const eT val = (*iter); - const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lowest) && (val < eT_int_max) && (eT(int(val)) == val); + const bool is_real_int = (is_real::yes) && arma_isfinite(val) && (val > eT_int_lower) && (val < eT_int_upper) && (eT(int(val)) == val); (is_real_int) ? arma_ostream::raw_print_elem(f, int(val)) : arma_ostream::raw_print_elem(f, val); @@ -3120,8 +3145,8 @@ diskio::save_coord_ascii(const SpMat< std::complex >& x, std::ostream& f) diskio::prepare_stream(f); - const T T_int_lowest = T(std::numeric_limits::lowest()); - const T T_int_max = T(std::numeric_limits::max()); + constexpr T T_int_lower = diskio::real_as_int_lower_limit(); + constexpr T T_int_upper = diskio::real_as_int_upper_limit(); typename SpMat::const_iterator iter = x.begin(); typename SpMat::const_iterator iter_end = x.end(); @@ -3136,8 +3161,8 @@ diskio::save_coord_ascii(const SpMat< std::complex >& x, std::ostream& f) const T val_r = std::real(val); const T val_i = std::imag(val); - const bool val_r_is_real_int = (is_real::yes) && arma_isfinite(val_r) && (val_r > T_int_lowest) && (val_r < T_int_max) && (T(int(val_r)) == val_r); - const bool val_i_is_real_int = (is_real::yes) && arma_isfinite(val_i) && (val_i > T_int_lowest) && (val_i < T_int_max) && (T(int(val_i)) == val_i); + const bool val_r_is_real_int = (is_real::yes) && arma_isfinite(val_r) && (val_r > T_int_lower) && (val_r < T_int_upper) && (T(int(val_r)) == val_r); + const bool val_i_is_real_int = (is_real::yes) && arma_isfinite(val_i) && (val_i > T_int_lower) && (val_i < T_int_upper) && (T(int(val_i)) == val_i); (val_r_is_real_int) ? arma_ostream::raw_print_elem(f, int(val_r)) : arma_ostream::raw_print_elem(f, val_r); diff --git a/inst/include/current/armadillo_bits/glue_hist_meat.hpp b/inst/include/current/armadillo_bits/glue_hist_meat.hpp index cd0ce6b6..edb09c07 100644 --- a/inst/include/current/armadillo_bits/glue_hist_meat.hpp +++ b/inst/include/current/armadillo_bits/glue_hist_meat.hpp @@ -109,7 +109,7 @@ glue_hist::apply_noalias(Mat& out, const Mat& X, const Mat& C, co { const eT val = X_mem[i]; - if(is_finite(val)) + if(arma_isfinite(val)) { eT opt_dist = (val >= center_0) ? (val - center_0) : (center_0 - val); uword opt_index = 0;