summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/eng.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/eng.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/eng.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/eng.c b/reference/C/CONTRIB/SNIP/eng.c
new file mode 100755
index 0000000..ad8cf91
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/eng.c
@@ -0,0 +1,50 @@
+/* ENG.C - Format floating point in engineering notation */
+/* Released to public domain by author, David Harmon, Jan. 1994 */
+
+#include <stdio.h>
+
+char *eng(double value, int places)
+{
+ const char * const prefixes[] = {
+ "a", "f", "p", "n", "æ", "m", "", "k", "M", "G", "T"
+ };
+ int p = 6;
+ static char result[30];
+ char *res = result;
+
+ if (value < 0.)
+ {
+ *res++ = '-';
+ value = -value;
+ }
+ while (value != 0 && value < 1. && p > 0)
+ {
+ value *= 1000.;
+ p--;
+ }
+ while (value != 0 && value > 1000. && p < 10 )
+ {
+ value /= 1000.;
+ p++;
+ }
+ if (value > 100.)
+ places--;
+ if (value > 10.)
+ places--;
+ sprintf(res, "%.*f %s", places-1, value, prefixes[p]);
+ return result;
+}
+
+#ifdef TEST
+
+#include <stdio.h>
+
+main()
+{
+ double w;
+
+ for (w = 1e-19; w < 1e16; w *= 42)
+ printf(" %g W = %sW\n", w, eng(w, 3));
+ return 0;
+}
+#endif