220 41354 <CALEPxfvZRppNMssi7byXc0oNuuw_Q88YhW7huMN0q4SJnXK-mw@mail.gmail.com> article
Path: news.gmane.org!.POSTED!not-for-mail
From: Dilip Ranganathan <misc.usage@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Optimizing Power Function for Integral Types
Date: Thu, 17 Jan 2019 11:06:11 -0500
Lines: 405
Approved: news@gmane.org
Message-ID: <CALEPxfvZRppNMssi7byXc0oNuuw_Q88YhW7huMN0q4SJnXK-mw@mail.gmail.com>
References: <fbfec82c-5416-4c96-b53b-ef3d4309b613@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/related; boundary="0000000000005b32d3057fa99317"
X-Trace: blaine.gmane.org 1547741058 20476 195.159.176.226 (17 Jan 2019 16:04:18 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Thu, 17 Jan 2019 16:04:18 +0000 (UTC)
To: std-proposals@isocpp.org
Original-X-From: std-proposals+bncBDA3LYNSSUHBB76PQLRAKGQEW75627A@isocpp.org Thu Jan 17 17:04:14 2019
Return-path: <std-proposals+bncBDA3LYNSSUHBB76PQLRAKGQEW75627A@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-oi1-f198.google.com ([209.85.167.198])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBDA3LYNSSUHBB76PQLRAKGQEW75627A@isocpp.org>)
	id 1gkA9N-0005AS-RI
	for gclcip-std-proposals@m.gmane.org; Thu, 17 Jan 2019 17:04:14 +0100
Original-Received: by mail-oi1-f198.google.com with SMTP id a62sf3483205oii.23
        for <gclcip-std-proposals@m.gmane.org>; Thu, 17 Jan 2019 08:06:25 -0800 (PST)
ARC-Seal: i=2; a=rsa-sha256; t=1547741184; cv=pass;
        d=google.com; s=arc-20160816;
        b=Rrq/52ZZcBZUYQwkfBv4657kPZLIV+7cJUuTiUSphfi1VtGCkwY4Kz5LnJ6+FbFGhP
         iEbzWWLWDxEIYUpV2hZyL3nLxRWLz9PaXIrxiV5Ljjrq5lIAdwbxJNBX/T9la/zALywZ
         idJcX0Rvt7+LBbV/sW+O+2c9XmDdgIXlJipOArh0dzESvZ5BauioamgVpvv9xtaw1mQI
         AN0KvxJBJp8sQqetUpTmgyJBZvaN2yiAJXcH9gTwRDhB2S9RXOOavRrFWFKDkZK9jkzs
         39cEJ9oNPKe6hB474OHZusCDyT90nxPz5d0QHwsPEGKgrnmp1Cd1PaLnGD64pqINeS1q
         5GhA==
ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
        h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post
         :list-id:mailing-list:precedence:reply-to:to:subject:message-id:date
         :from:in-reply-to:references:mime-version:dkim-signature;
        bh=OXGPgO4YEUPHggtphP7PbdVVH+nlMSm5yYL7nnUXaiI=;
        b=c/8TbSpnhLsfpbcZIFVRs2cxtFpug52omrpfPwwG+yaO41KusiKsDIXxzcbm3+w5DA
         Kjo2sCQaHeQMWlauG0Am6f5YeKVzUPTzskGCoRR6hf/RS63SAjJ6UoiEXWq/zhUeE+qg
         ysZpTUdmIhQ6JBOU7AVvLN+DZvTqp8Gjek/wAzNe+dYwwlpbZN90zhSFvBTp/GGSMSkx
         2SiEi9m6qkFebU1mHcrbpQqHgxgEBbbbCBskzJpW+pPQigrOw9tEd/m4ZlSYvmpYFBMO
         Vh8rWjVvNGj98taOqGdG62776i9zwO7m/eo25TGetghv6yCire1q3J1sM45lHeCfKouX
         ZVhg==
ARC-Authentication-Results: i=2; mx.google.com;
       dkim=pass header.i=@gmail.com header.s=20161025 header.b=hT3icDtF;
       spf=pass (google.com: domain of misc.usage@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=misc.usage@gmail.com;
       dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=mime-version:references:in-reply-to:from:date:message-id:subject:to
         :x-original-sender:x-original-authentication-results:reply-to
         :precedence:mailing-list:list-id:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=OXGPgO4YEUPHggtphP7PbdVVH+nlMSm5yYL7nnUXaiI=;
        b=MTWRkmdrDbf4P7FH50k9YVN2cOvut7X2+VPLf0oCATs7+lNAlHU6m+IKXdSroYP4AQ
         /qr9V+qI09NNcgmplJXAnzI6jWK+4jVnLfRv8KUn3t/te3VFPyhJahYZy10ZuoUopFlq
         3e0N6MqQ6BYPClh6tKg71tLPJyBPAdvc8BKxXnvWKqG4b3oq/yP/NuFnUJ52ua/XIdFN
         g48qwxCYEXH0OEfocXGDemQ51HnuV+2/GkAlG1cSOzrrRUwFLE8Q3CoS6E+2xzlMJzyL
         cT2JsD6Qo82EJb1Mm5rvVnyDI+hxDnSTCelpbd/y9fw1fcHYH9DU9fVEnAc0S0ckndTS
         gk3w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:mime-version:references:in-reply-to:from:date
         :message-id:subject:to:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=OXGPgO4YEUPHggtphP7PbdVVH+nlMSm5yYL7nnUXaiI=;
        b=mZrSXFOAiMX7ExqC0ZxjUdF/EMdfLU7I+/ewtjfyGYvN6zktb23UP4R8Wa8+paDqm6
         PkbWbb73xcW+cIn/RkKpADKyaiJTGixA5MAdrHC7oG7GhmbfF/Giz2oubCcWvTgeJ8Oe
         uVRqCGZ7Py9FkaogVKl1ue/4tlb/uTbKK5rZeniYJ1gXyhTJ+2pSysj1FspCWxpDmNk6
         tZztW7qg4BatKvUwi1PxgaBD9GniWzw3eZvizZQBjdzRus6NP9Ia2reAzOBcRhpUe3Mu
         eMBWfElaJkuwTYX3ILCOooW70qyzn2mcW0Qt+Id84kcSOudk06GRTItQmQGsjIKy5gVq
         kiwQ==
X-Gm-Message-State: AJcUukeaWoFXINtgIdu9ECIwHe00QzPXc0WZKhSSzv9ln+pHC7gXqkCx
	00F5AXaMqSV11slu67Gjy4qOvQ==
X-Google-Smtp-Source: ALg8bN5bmt6kL7DSOVm62ilFHBLjn54rthoCPD76NBRivlB0CyQOc7HS+a8q1A0B8Xic/yLW4t7/Fw==
X-Received: by 2002:aca:f246:: with SMTP id q67mr8797768oih.7.1547741184744;
        Thu, 17 Jan 2019 08:06:24 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 2002:a9d:8:: with SMTP id 8ls5655669ota.7.gmail; Thu, 17 Jan 2019
 08:06:23 -0800 (PST)
X-Received: by 2002:a9d:6a81:: with SMTP id l1mr9690643otq.3.1547741183016;
        Thu, 17 Jan 2019 08:06:23 -0800 (PST)
ARC-Seal: i=1; a=rsa-sha256; t=1547741182; cv=none;
        d=google.com; s=arc-20160816;
        b=PHYhIiAxl0wJ9ZRw3miuydBrIR2w+N3RYc8msRvJnq9jGnFg+QuAMT6gR+vIBbuy/Q
         J5i+zUjmWaKUiAf2bpeZ8mjV3HueOtcMeqd6m9m47c86joFKOtjd0IqanhCqc8HuLgje
         md+/24Ow1yuERFDLE86JEINHxAy4th0aLilVJ/cVE3kHDzXONFb4OdDBwFTUFvH+aGm7
         DwglWutfbks406B1MD5TozXI3tqJCoWyBEjOb2nWujLhfTKMBqZZLLqVhLPyIBInX+1X
         w70QX5BUI0tR7/8l4XM3YWnS3uUPq14nnWrdBOYfzRGL2g9blDsY4/rnzt0RATF+bjUD
         oTPA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
        h=to:subject:message-id:date:from:in-reply-to:references:mime-version
         :dkim-signature;
        bh=Cyjw4tAujNgDwnxNNcIiLZ0mT1KgZZnmE8aK3vz9RRs=;
        b=k86eOycDsUGNE1/8LzCu4qA+9EReN2ZmcA3RiwOI9+0tW5nQ6lsqDDmFzExtdscxOX
         K2x4wYJxHTGlFj3qanqia0RnvAltQcPthh74/hPCYxptEsPAUqrY3qoe059vRzijp0fa
         RAtfVv0oP9VZgZW6d7Bw01lK5+FdGDwCE6COEkyuPhddMM9ztDHqAtydkTxnsMsL2Ldq
         ykX4sboBXn+1ArL3aVfFfCMDSwuwLAZWf4et0I93KQWYroNRf1Vwj31CgSKhHNgYVUkE
         Q6uvRYCWkbJxSJa6xU/ztxvFHAOm6DXVHydEBFDy2QJqg6ElmiGN0oKd+/IWZNuoVnzb
         uleg==
ARC-Authentication-Results: i=1; mx.google.com;
       dkim=pass header.i=@gmail.com header.s=20161025 header.b=hT3icDtF;
       spf=pass (google.com: domain of misc.usage@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=misc.usage@gmail.com;
       dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
Original-Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41])
        by mx.google.com with SMTPS id r197sor1104079oie.80.2019.01.17.08.06.22
        for <std-proposals@isocpp.org>
        (Google Transport Security);
        Thu, 17 Jan 2019 08:06:22 -0800 (PST)
Received-SPF: pass (google.com: domain of misc.usage@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41;
X-Received: by 2002:aca:4b48:: with SMTP id y69mr8347265oia.200.1547741181945;
 Thu, 17 Jan 2019 08:06:21 -0800 (PST)
In-Reply-To: <fbfec82c-5416-4c96-b53b-ef3d4309b613@isocpp.org>
X-Original-Sender: misc.usage@gmail.com
X-Original-Authentication-Results: mx.google.com;       dkim=pass
 header.i=@gmail.com header.s=20161025 header.b=hT3icDtF;       spf=pass
 (google.com: domain of misc.usage@gmail.com designates 209.85.220.41 as
 permitted sender) smtp.mailfrom=misc.usage@gmail.com;       dmarc=pass
 (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:41354
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/41354>

--0000000000005b32d3057fa99317
Content-Type: multipart/alternative; boundary="0000000000005b32d0057fa99316"

--0000000000005b32d0057fa99316
Content-Type: text/plain; charset="UTF-8"

I am just writing to +1 this. I have long wondered why there is no int
overload
for the pow function but wasn't confident enough of asking here fearing that
I would've missed something blindingly obvious.

Thanks Joel for taking that baton.

On Thu, Jan 17, 2019 at 11:02 AM <joel.g.hemphill@gmail.com> wrote:

> As of C++11, per overload 7 of the 'pow' function (
> https://en.cppreference.com/w/cpp/numeric/math/pow), integral types can
> be used as parameters, but they will be cast to double before calculation.
> I believe that an integral-specific overload should be made, which makes
> use of faster integer-operations available to CPUs.
>
> As a disclaimer, I am still a rather inexperienced programmer (College
> Sophomore), and I my have some misunderstands as to what would fall under
> the ISO standard and what would fall under compiler-implementations. As I
> understand it, the line about "If any argument has integral type, it is
> cast to double." is a component of the ISO standard.
>
> As stated on isocpp.org's FAQ section, this idea is based on existing
> practices. As discussed here (
> https://stackoverflow.com/questions/2398442/why-isnt-int-powint-base-int-exponent-in-the-standard-c-libraries),
> multiple implementations of this function have been made on a per-user
> basis, due to its general simplicity and lack of inclusion in previous
> standards. In the below testing, I created a function using x86 asm. It is
> worth noting that even with more standard C++ approaches, as testified in
> the stackoverflow discussion above, a significant performance improvement
> can be made.
>
> For the sake of brevity, the data-table and source have been withheld, but
> if it is relevant to the conversation, I would be more than willing to
> provide them.
>
> Do any of you agree that this is a useful addition to the C++ standards?
>
> *Performance Testing:*
> Tests were run on an Intel Core i3 6006U @ 2.0GHz
>
> Custom Function (VS 2017) :
> __declspec(naked) __int32 __fastcall powi(__int32 base, __int32 exp) {
> __asm { ... } }
>
> Test Range:
>
> base: [-46340, 46340]  (int-truncation of the sqrt of MAX_INT)
>
> exp: [-19, 19] (highest power of 3, that does not overflow the int type)
>
>
> Results: (Approx. x20 avg. improvement)
>
> [image: Untitled.png]
>
>
> *Possible Use-Cases:*
>
> Allocation of N-dimensional arrays, with N^M elements.
>
> --
> You received this message because you are subscribed to the Google Groups
> "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to std-proposals+unsubscribe@isocpp.org.
> To post to this group, send email to std-proposals@isocpp.org.
> To view this discussion on the web visit
> https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-4c96-b53b-ef3d4309b613%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-4c96-b53b-ef3d4309b613%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALEPxfvZRppNMssi7byXc0oNuuw_Q88YhW7huMN0q4SJnXK-mw%40mail.gmail.com.

--0000000000005b32d0057fa99316
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">I am just writing to=C2=A0+1 this. I have long wondered wh=
y there is no int overload<br>for the pow function but wasn&#39;t confident=
 enough of asking here fearing that<br>I would&#39;ve missed something blin=
dingly obvious.<div><br></div><div>Thanks Joel for taking that baton.</div>=
</div><br><div class=3D"gmail_quote"><div dir=3D"ltr">On Thu, Jan 17, 2019 =
at 11:02 AM &lt;<a href=3D"mailto:joel.g.hemphill@gmail.com">joel.g.hemphil=
l@gmail.com</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><div dir=3D"ltr">As of C++11, per overload 7 of the &#39;pow&#39=
; function (<a href=3D"https://en.cppreference.com/w/cpp/numeric/math/pow" =
target=3D"_blank">https://en.cppreference.com/w/cpp/numeric/math/pow</a>), =
integral types can be used as parameters, but they will be cast to double b=
efore calculation. I believe that an integral-specific overload should be m=
ade, which makes use of faster integer-operations available to CPUs.<div><b=
r></div><div>As a disclaimer, I am still a rather inexperienced programmer =
(College Sophomore), and I my have some misunderstands as to what would fal=
l under the ISO standard and what would fall under compiler-implementations=
.. As I understand it, the line about &quot;<span style=3D"color:rgb(0,0,0);=
font-family:DejaVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:1=
2.8px">If any argument has integral type,=C2=A0</span><span style=3D"color:=
rgb(0,0,0);font-family:DejaVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif;=
font-size:12.8px">it is cast to double.&quot; is a component of the ISO sta=
ndard.</span></div><div><span style=3D"color:rgb(0,0,0);font-family:DejaVuS=
ans,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.8px"><br></span><=
/div><div style=3D"text-indent:0px"><span style=3D"color:rgb(0,0,0);font-fa=
mily:DejaVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.8px">=
As stated on <a href=3D"http://isocpp.org" target=3D"_blank">isocpp.org</a>=
&#39;s FAQ section, this idea is based on existing practices. As discussed =
here (</span><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, arial=
, sans-serif"><a href=3D"https://stackoverflow.com/questions/2398442/why-is=
nt-int-powint-base-int-exponent-in-the-standard-c-libraries" style=3D"font-=
size:12.8px" target=3D"_blank">https://stackoverflow.com/questions/2398442/=
why-isnt-int-powint-base-int-exponent-in-the-standard-c-libraries</a><span =
style=3D"font-size:12.8px">), multiple implementations=C2=A0of this functio=
n have been made on a per-user basis, due to its general simplicity and lac=
k of inclusion in previous standards. In the below testing, I created a fun=
ction using x86 asm. It is worth noting that even with more standard C++ ap=
proaches, as testified in the stackoverflow discussion above, a significant=
 performance improvement can be made.</span></font></div><div style=3D"text=
-indent:0px"><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, arial=
, sans-serif"><span style=3D"font-size:12.8px"><br></span></font></div><div=
 style=3D"text-indent:0px"><font color=3D"#000000" face=3D"DejaVuSans, Deja=
Vu Sans, arial, sans-serif"><span style=3D"font-size:12.8px">For the sake o=
f brevity, the data-table and source have been withheld, but if it is relev=
ant=C2=A0to the conversation, I would be more than willing to provide them.=
</span></font></div><div style=3D"text-indent:0px"><font color=3D"#000000" =
face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><span style=3D"font-siz=
e:12.8px"><br></span></font></div><div style=3D"text-indent:0px"><font colo=
r=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><span sty=
le=3D"font-size:12.8px">Do any of you agree that this is a useful addition =
to the C++ standards?</span></font></div><div><b><br></b></div><div><b>Perf=
ormance Testing:</b></div><div><div><font size=3D"1">Tests were run on an I=
ntel Core i3 6006U @ 2.0GHz</font></div><div><br></div><div>Custom Function=
 (VS 2017) : <div class=3D"gmail-m_4824888265353890807prettyprint" style=3D=
"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-sty=
le:solid;border-width:1px"><code class=3D"gmail-m_4824888265353890807pretty=
print"><div class=3D"gmail-m_4824888265353890807subprettyprint"><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-m_4824888265353890807styled-by-prettif=
y">__declspec</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_4=
824888265353890807styled-by-prettify">(</span><span style=3D"color:rgb(0,0,=
0)" class=3D"gmail-m_4824888265353890807styled-by-prettify">naked</span><sp=
an style=3D"color:rgb(102,102,0)" class=3D"gmail-m_4824888265353890807style=
d-by-prettify">)</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_48=
24888265353890807styled-by-prettify"> __int32 __fastcall powi</span><span s=
tyle=3D"color:rgb(102,102,0)" class=3D"gmail-m_4824888265353890807styled-by=
-prettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_482488=
8265353890807styled-by-prettify">__int32 </span><span style=3D"color:rgb(0,=
0,136)" class=3D"gmail-m_4824888265353890807styled-by-prettify">base</span>=
<span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_4824888265353890807st=
yled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_4824888265353890807styled-by-prettify"> __int32 exp</span><span style=3D"c=
olor:rgb(102,102,0)" class=3D"gmail-m_4824888265353890807styled-by-prettify=
">)</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_482488826535389=
0807styled-by-prettify"> </span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-m_4824888265353890807styled-by-prettify">{</span><span style=3D"c=
olor:rgb(0,0,0)" class=3D"gmail-m_4824888265353890807styled-by-prettify"> _=
_asm </span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_482488826=
5353890807styled-by-prettify">{</span><span style=3D"color:rgb(0,0,0)" clas=
s=3D"gmail-m_4824888265353890807styled-by-prettify"> </span><span style=3D"=
color:rgb(102,102,0)" class=3D"gmail-m_4824888265353890807styled-by-prettif=
y">...</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_482488826535=
3890807styled-by-prettify"> </span><span style=3D"color:rgb(102,102,0)" cla=
ss=3D"gmail-m_4824888265353890807styled-by-prettify">}</span><span style=3D=
"color:rgb(0,0,0)" class=3D"gmail-m_4824888265353890807styled-by-prettify">=
 </span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_4824888265353=
890807styled-by-prettify">}</span></div></code></div></div><div><br></div><=
div>Test Range:</div><blockquote style=3D"margin:0px 0px 0px 40px;border:no=
ne;padding:0px"><div>base: [-46340, 46340]=C2=A0 (int-truncation of the sqr=
t of MAX_INT)</div></blockquote><blockquote style=3D"margin:0px 0px 0px 40p=
x;border:none;padding:0px">exp: [-19, 19] (highest power of 3, that does no=
t overflow the int type)</blockquote><div><br></div><div>Results: (Approx. =
x20 avg. improvement)</div><p class=3D"gmail-m_4824888265353890807separator=
" style=3D"text-align:left;clear:both"><img src=3D"cid:8babe2aa-8688-46ef-8=
cca-eca48b935eda" alt=3D"Untitled.png" width=3D"320" height=3D"183" style=
=3D"margin-left: 1em; margin-right: 1em;"></p><p class=3D"gmail-m_482488826=
5353890807separator" style=3D"text-align:left;clear:both"><br></p><p class=
=3D"gmail-m_4824888265353890807separator" style=3D"text-align:left;clear:bo=
th"><b>Possible Use-Cases:</b></p><p class=3D"gmail-m_4824888265353890807se=
parator" style=3D"text-align:left;clear:both">Allocation of N-dimensional a=
rrays, with N^M elements.</p></div></div>

<p></p>

-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_=
blank">std-proposals+unsubscribe@isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-4c96-b53b-ef3d4309b613%=
40isocpp.org?utm_medium=3Demail&amp;utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-=
4c96-b53b-ef3d4309b613%40isocpp.org</a>.<br>
</blockquote></div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CALEPxfvZRppNMssi7byXc0oNuuw_Q88YhW7h=
uMN0q4SJnXK-mw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALEPxfvZRppNMssi=
7byXc0oNuuw_Q88YhW7huMN0q4SJnXK-mw%40mail.gmail.com</a>.<br />

--0000000000005b32d0057fa99316--
--0000000000005b32d3057fa99317
Content-Type: image/png; name="Untitled.png"
Content-Disposition: inline; filename="Untitled.png"
Content-Transfer-Encoding: base64
Content-ID: <8babe2aa-8688-46ef-8cca-eca48b935eda>
X-Attachment-Id: 8babe2aa-8688-46ef-8cca-eca48b935eda

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
AElFTkSuQmCC
--0000000000005b32d3057fa99317--

.
