Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove 'clever' NA checks #790

Merged
merged 1 commit into from
Dec 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
2017-12-19 Kevin Ushey <kevinushey@gmail.com>

* inst/include/Rcpp/internal/na.h: Remove 'clever' NA / NaN checks

2017-12-16 Dirk Eddelbuettel <edd@debian.org>

* DESCRIPTION (Date, Version): Updated minor version and date
Expand Down
63 changes: 0 additions & 63 deletions inst/include/Rcpp/internal/na.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,67 +23,6 @@
namespace Rcpp {
namespace internal {

// we rely on the presence of unsigned long long types, since we
// want to compare specific bit patterns, but we can't explicitly
// assign a hex to a double storage.

#ifdef RCPP_HAS_LONG_LONG_TYPES

#ifdef HAS_STATIC_ASSERT
static_assert(
sizeof(rcpp_ulong_long_type) == sizeof(double),
"unsigned long long and double have same size"
);
#endif

// motivation: on 32bit architectures, we only see 'LargeNA'
// as defined ahead; on 64bit architectures, R defaults to
// 'SmallNA' for R_NaReal, but this can get promoted to 'LargeNA'
// if a certain operation can create a 'signalling' NA, e.g. NA_real_+1
static const rcpp_ulong_long_type SmallNA = 0x7FF00000000007A2;
static const rcpp_ulong_long_type LargeNA = 0x7FF80000000007A2;

struct NACanChange {
enum { value = sizeof(void*) == 8 };
};

template <bool NACanChange>
bool Rcpp_IsNA__impl(double);

template <>
inline bool Rcpp_IsNA__impl<true>(double x) {
return memcmp(
(void*) &x,
(void*) &SmallNA,
sizeof(double)
) == 0 or memcmp(
(void*) &x,
(void*) &LargeNA,
sizeof(double)
) == 0;
}

template <>
inline bool Rcpp_IsNA__impl<false>(double x) {
return memcmp(
(void*) &x,
(void*) &LargeNA,
sizeof(double)
) == 0;
}

inline bool Rcpp_IsNA(double x) {
return Rcpp_IsNA__impl< NACanChange::value >(x);
}

inline bool Rcpp_IsNaN(double x) {
return R_IsNaN(x);
}

#else

// fallback when we don't have unsigned long long

inline bool Rcpp_IsNA(double x) {
return R_IsNA(x);
}
Expand All @@ -92,7 +31,5 @@ inline bool Rcpp_IsNaN(double x) {
return R_IsNaN(x);
}

#endif

}
}