diff --git a/linpack_accelerate.c b/linpack_accelerate.c
index 03074d2d6c3c42917e6722adb4f103737525e9b0..4495002a553d19e354500c7ebb20ea00111d335a 100644
--- a/linpack_accelerate.c
+++ b/linpack_accelerate.c
@@ -29,11 +29,25 @@
 #include <time.h>
 #include <float.h>
 
+#if defined(SP)
+#define ZERO        0.0
+#define ONE         1.0
+#define PREC        "Single"
+#define BASE10DIG   FLT_DIG
+
+typedef float   REAL;
+
+#elif defined(DP)
+
 #define ZERO        0.0e0
 #define ONE         1.0e0
 #define PREC        "Double"
 #define BASE10DIG   DBL_DIG
 
+typedef double  REAL;
+
+#endif
+
 #if defined(__LP64__)
 typedef int LPLONG;
 #define PLF "d"
@@ -42,15 +56,12 @@ typedef long LPLONG;
 #define PLF "ld"
 #endif
 
-typedef double  REAL;
-
 static REAL linpack  (LPLONG nreps,int arsize);
 static void matgen   (REAL *a,int lda,int n,REAL *b,REAL *norma);
 static REAL second   (void);
 
 static void *mempool;
 
-
 int
 main(void)
 {
@@ -157,7 +168,11 @@ main(void)
 */
 static void dgefa(REAL *a, LPLONG lda, LPLONG n, LPLONG *ipvt, LPLONG *info)
 {
+#if defined(DP)
     dgetrf_(&n, &n, a, &lda, ipvt, info);
+#elif defined(SP)
+    sgetrf_(&n, &n, a, &lda, ipvt, info);
+#endif
 }
 
 /*
@@ -228,7 +243,11 @@ dgesl(REAL *a, LPLONG lda, LPLONG n, LPLONG *ipvt, REAL *b, int job)
     LPLONG nrhs = 1;
     LPLONG ldb = n;
     static char trans = 'N';
+#if defined(DP)
     dgetrs_(&trans, &n, &nrhs, a, &lda, ipvt, b, &ldb, &info);
+#elif defined(SP)
+    sgetrs_(&trans, &n, &nrhs, a, &lda, ipvt, b, &ldb, &info);
+#endif
 }