diff --git a/lapack/experimental/ilaver.cpp b/lapack/experimental/ilaver.cpp
deleted file mode 100644
index ddab5dd..0000000
--- a/lapack/experimental/ilaver.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "../../Eigen/Core"
-
-extern "C" {
-void ilaver_(int* major, int* minor, int* patch);
-}
-
-void ilaver_(int* major, int* minor, int* patch) {
-  *major = EIGEN_WORLD_VERSION;
-  *minor = EIGEN_MAJOR_VERSION;
-  *patch = EIGEN_MINOR_VERSION;
-}
diff --git a/lapack/experimental/xlamch.cpp b/lapack/experimental/xlamch.cpp
deleted file mode 100644
index 3449f9f..0000000
--- a/lapack/experimental/xlamch.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#include <limits>
-
-extern "C" {
-float slamch_(char* cmach);
-double dlamch_(char* cmach);
-float slamc3_(char* cmach);
-double dlamc3_(char* cmach);
-}
-
-// Determines machine parameters.
-template <typename T>
-T xlamch(const char c) {
-  if (c ==  'E' || c ==  'e') {
-    // eps = relative machine precision
-    return std::numeric_limits<T>::epsilon()/std::numeric_limits<T>::radix;
-  }
-
-  if (c == 'S' || c == 's') {
-    // sfmin = safe minimum, such that 1 / sfmin does not overflow
-    T sfmin = std::numeric_limits<T>::min();
-    const T small = T(1) / std::numeric_limits<T>::max();
-    if (small >= sfmin) {
-      sfmin = small * (T(1) + std::numeric_limits<T>::epsilon() /
-                                  std::numeric_limits<T>::radix);
-    }
-    return sfmin;
-  }
-
-  if (c ==  'B' || c ==  'b') {
-    // base =  base of the machine.
-    return std::numeric_limits<T>::radix;
-  }
-
-  if (c ==  'P' || c ==  'p') {
-    // prec = eps * base
-    return std::numeric_limits<T>::epsilon();
-  }
-
-  if (c ==  'N' || c ==  'n') {
-    // t = number of (base) digits in the mantissa
-    return std::numeric_limits<T>::digits;
-  }
-
-  if (c ==  'R' || c ==  'r') {
-    // rnd = 1.0 when rounding occurs in addition.
-    return 1;
-  }
-
-  if (c ==  'M' || c ==  'm') {
-    // emin = minimum exponent before (gradual) underflow
-    return std::numeric_limits<T>::min_exponent;
-  }
-
-  if (c ==  'U' || c ==  'u') {
-    // rmin =  underflow threshold - base**(emin-1)
-    return std::numeric_limits<T>::min();
-  }
-
-  if (c ==  'L' || c ==  'l') {
-    // emax = largest exponent before overflow
-    return std::numeric_limits<T>::max_exponent;
-  }
-  if (c ==  'O' || c ==  'o') {
-    // rmax  = overflow threshold  - (base**emax)*(1-eps)
-    return std::numeric_limits<T>::max();
-  }
-
-  return 0;
-}
-
-float slamch_(char* cmach) { return xlamch<float>(*cmach); }
-double dlamch_(char* cmach) { return xlamch<double>(*cmach); }
-
-// xLAMC3  is intended to force  A  and  B  to be stored prior to doing
-// the addition of  A  and  B ,  for use in situations where optimizers
-// might hold one of these in a register.
-float slamc3_(float *a, float *b) {
-  volatile float retval = *a + *b;
-  return retval;
-}
-
-double dlamc3_(double *a, double *b) {
-  volatile double retval = *a + *b;
-  return retval;
-}
-
