November 30, 2009 [Issue 3561] New: math.abs signature accepts static arrays, but errors internally. | ||||
---|---|---|---|---|
| ||||
http://d.puremagic.com/issues/show_bug.cgi?id=3561 Summary: math.abs signature accepts static arrays, but errors internally. Product: D Version: 2.036 Platform: Other OS/Version: Windows Status: NEW Keywords: diagnostic, patch Severity: enhancement Priority: P2 Component: Phobos AssignedTo: nobody@puremagic.com ReportedBy: sandford@jhu.edu --- Comment #0 from Rob Jacques <sandford@jhu.edu> 2009-11-30 13:10:14 PST --- I ran into this while converting a Vector struct to the new value type static arrays. Essentially, float[3] x; x.abs; Errors inside of the abs function. The simple solution is to add !isArray!Num to the list of template constraints. However, since I feel it's useful, I've also included a patch to add support for static arrays to the abs function. /*********************************** * Calculates the absolute value * * For complex numbers, abs(z) = sqrt( $(POWER z.re, 2) + $(POWER z.im, 2) ) * = hypot(z.re, z.im). */ pure nothrow Num abs(Num)(Num x) if (is(typeof(Num.init >= 0)) && is(typeof(-Num.init)) && !isDynamicArray!Num && !(is(Num* : const(ifloat*)) || is(Num* : const(idouble*)) || is(Num* : const(ireal*)))) { static if (isFloatingPoint!(Num)) return fabs(x); else static if(isStaticArray!Num) { typeof(return) a; foreach(i,ref b; a) b = abs(x[i]); return a; } else return x>=0 ? x : -x; } pure nothrow auto abs(Num)(Num z) if (is(Num* : const(cfloat*)) || is(Num* : const(cdouble*)) || is(Num* : const(creal*))) { return hypot(z.re, z.im); } /** ditto */ pure nothrow real abs(Num)(Num y) if (is(Num* : const(ifloat*)) || is(Num* : const(idouble*)) || is(Num* : const(ireal*))) { return fabs(y.im); } unittest { assert(isIdentical(abs(-0.0L), 0.0L)); assert(isNaN(abs(real.nan))); assert(abs(-real.infinity) == real.infinity); assert(abs(-3.2Li) == 3.2L); assert(abs(71.6Li) == 71.6L); assert(abs(-56) == 56); assert(abs(2321312L) == 2321312L); assert(abs(-1+1i) == sqrt(2.0)); assert(abs([-1,-2,-3]) == [1,2,3]); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
December 21, 2012 [Issue 3561] math.abs signature accepts static arrays, but errors internally. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rob Jacques | http://d.puremagic.com/issues/show_bug.cgi?id=3561 Andrej Mitrovic <andrej.mitrovich@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords|diagnostic | CC| |andrej.mitrovich@gmail.com --- Comment #1 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2012-12-21 10:15:58 PST --- It doesn't error internally anymore. But I'm keeping it open for the enhancement request for static array support. Btw your patch doesn't seem to work for this test-case anymore: assert(abs([-1,-2,-3]) == [1,2,3]); -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
Copyright © 1999-2021 by the D Language Foundation