Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] zsh/mathfunc: Add log2()
- X-seq: zsh-workers 43275
- From: dana <dana@xxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATCH] zsh/mathfunc: Add log2()
- Date: Sun, 12 Aug 2018 03:20:37 -0500
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dana-is.20150623.gappssmtp.com; s=20150623; h=from:content-transfer-encoding:mime-version:subject:message-id:date :to; bh=8BZcIIC2kE3EhT32rL4rC2RQODtALJRZ8C4Ncnn2/1s=; b=CcGJWT8CiKj1295Vo2ZlvdfysprctKhdLICC5MHf0kjO6rV13t0Nsrw84lIEHrliFq g5rnQ7wxkF9Y1KJVC19opCJDi73Wd438BuDOrOgRSc3XGR8ara+RxbppBMHmSmqTatss OJovl6daeDQpYoy/GKmSd9FQT0iDMVllLYrQdo86rDgxhnExZGCt/xrcNQfOX+a7LM0j sqLPPlsJCE41nP3NFbPDP2kbF61w5ccLZ+1+FOeKHn5Qqd3WdTNZOkdwltLj88t0eW2B AlCdwsTLN2XdvI3T4XQxG2q4zBft5In5L2uBai0FlkzhQi3xO1iUyEtX85Z5Ik5opN41 n5Lw==
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- List-unsubscribe: <mailto:zsh-workers-unsubscribe@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
Someone on IRC today was absolutely incensed that zsh/mathfunc doesn't provide a
log2(). I assume that's just because it's trivial to do it in 'user land'. But
it's also trivial to do it here, so....
I added an #ifdef like in workers/39064, since i read on-line that there were
still libraries missing the C99 function fairly recently. And since i added an
#ifdef i also added a test.
dana
diff --git a/Doc/Zsh/mod_mathfunc.yo b/Doc/Zsh/mod_mathfunc.yo
index 8b72de3ab..428a5be47 100644
--- a/Doc/Zsh/mod_mathfunc.yo
+++ b/Doc/Zsh/mod_mathfunc.yo
@@ -24,9 +24,9 @@ The following functions take a single floating point argument: tt(acos),
tt(acosh), tt(asin), tt(asinh), tt(atan), tt(atanh), tt(cbrt), tt(ceil),
tt(cos), tt(cosh), tt(erf), tt(erfc), tt(exp), tt(expm1), tt(fabs),
tt(floor), tt(gamma), tt(j0), tt(j1), tt(lgamma), tt(log), tt(log10),
-tt(log1p), tt(logb), tt(sin), tt(sinh), tt(sqrt), tt(tan), tt(tanh),
-tt(y0), tt(y1). The tt(atan) function can optionally take a second
-argument, in which case it behaves like the C function tt(atan2).
+tt(log1p), tt(log2), tt(logb), tt(sin), tt(sinh), tt(sqrt), tt(tan),
+tt(tanh), tt(y0), tt(y1). The tt(atan) function can optionally take a
+second argument, in which case it behaves like the C function tt(atan2).
The tt(ilogb) function takes a single floating point argument, but
returns an integer.
diff --git a/Src/Modules/mathfunc.c b/Src/Modules/mathfunc.c
index d1c3e089a..fc2593dca 100644
--- a/Src/Modules/mathfunc.c
+++ b/Src/Modules/mathfunc.c
@@ -65,6 +65,7 @@ MF_LGAMMA,
MF_LOG,
MF_LOG10,
MF_LOG1P,
+MF_LOG2,
MF_LOGB,
MF_NEXTAFTER,
MF_RINT,
@@ -142,6 +143,7 @@ static struct mathfunc mftab[] = {
NUMMATHFUNC("log", math_func, 1, 1, MF_LOG),
NUMMATHFUNC("log10", math_func, 1, 1, MF_LOG10),
NUMMATHFUNC("log1p", math_func, 1, 1, MF_LOG1P),
+ NUMMATHFUNC("log2", math_func, 1, 1, MF_LOG2),
NUMMATHFUNC("logb", math_func, 1, 1, MF_LOGB),
NUMMATHFUNC("nextafter", math_func, 2, 2, MF_NEXTAFTER),
#ifdef HAVE_ERAND48
@@ -338,6 +340,14 @@ math_func(UNUSED(char *name), int argc, mnumber *argv, int id)
retd = log1p(argd);
break;
+ case MF_LOG2:
+#ifdef HAVE_LOG2
+ retd = log2(argd);
+#else
+ retd = log(argd) / log(2);
+#endif
+ break;
+
case MF_LOGB:
retd = logb(argd);
break;
diff --git a/Test/V03mathfunc.ztst b/Test/V03mathfunc.ztst
index d6b4e0987..9a297d69d 100644
--- a/Test/V03mathfunc.ztst
+++ b/Test/V03mathfunc.ztst
@@ -139,3 +139,9 @@ F:This test fails if your math library doesn't have erand48().
print $g, $l
0:Test Gamma function gamma and lgamma
>1.00000, 0.00000
+
+ float -F 5 a b c
+ (( a = log2(0.5), b = log2(1.5), c = log2(99) ))
+ print -r - "$a, $b, $c"
+0:log2
+>-1.00000, 0.58496, 6.62936
diff --git a/configure.ac b/configure.ac
index 53c30c2cf..5e13c0f11 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1266,6 +1266,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
isblank iswblank \
uname \
signgam tgamma \
+ log2 \
scalbn \
putenv getenv setenv unsetenv xw\
brk sbrk \
Messages sorted by:
Reverse Date,
Date,
Thread,
Author