Topic: Optimizing Power Function for Integral Types


Author: joel.g.hemphill@gmail.com
Date: Thu, 17 Jan 2019 08:02:13 -0800 (PST)
Raw View
------=_Part_159_387068105.1547740933607
Content-Type: multipart/alternative;
 boundary="----=_Part_160_1686897718.1547740933607"

------=_Part_160_1686897718.1547740933607
Content-Type: text/plain; charset="UTF-8"

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.

------=_Part_160_1686897718.1547740933607
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<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">https://en.=
cppreference.com/w/cpp/numeric/math/pow</a>), 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 faste=
r integer-operations available to CPUs.<div><br></div><div>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 lin=
e about &quot;<span style=3D"color: rgb(0, 0, 0); font-family: DejaVuSans, =
&quot;DejaVu Sans&quot;, arial, sans-serif; font-size: 12.8px; text-indent:=
 -64px;">If any argument has integral type,=C2=A0</span><span style=3D"colo=
r: rgb(0, 0, 0); font-family: DejaVuSans, &quot;DejaVu Sans&quot;, arial, s=
ans-serif; font-size: 12.8px; text-indent: -64px;">it is cast to double.&qu=
ot; is a component of the ISO standard.</span></div><div><span style=3D"col=
or: rgb(0, 0, 0); font-family: DejaVuSans, &quot;DejaVu Sans&quot;, arial, =
sans-serif; font-size: 12.8px; text-indent: -64px;"><br></span></div><div s=
tyle=3D"text-indent: 0px;"><span style=3D"color: rgb(0, 0, 0); font-family:=
 DejaVuSans, &quot;DejaVu Sans&quot;, arial, sans-serif; font-size: 12.8px;=
 text-indent: -64px;">As stated on isocpp.org&#39;s FAQ section, this idea =
is based on existing practices. As discussed here (</span><font color=3D"#0=
00000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><a href=3D"https=
://stackoverflow.com/questions/2398442/why-isnt-int-powint-base-int-exponen=
t-in-the-standard-c-libraries" style=3D"font-size: 12.8px;">https://stackov=
erflow.com/questions/2398442/why-isnt-int-powint-base-int-exponent-in-the-s=
tandard-c-libraries</a><span style=3D"font-size: 12.8px;">), multiple imple=
mentations=C2=A0of 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.</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: 1=
2.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;">For the sake of brevity, the data-table and sourc=
e have been withheld, but if it is relevant=C2=A0to the conversation, I wou=
ld be more than willing to provide them.</span></font></div><div style=3D"t=
ext-indent: 0px;"><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, =
arial, sans-serif"><span style=3D"font-size: 12.8px;"><br></span></font></d=
iv><div style=3D"text-indent: 0px;"><font color=3D"#000000" face=3D"DejaVuS=
ans, DejaVu Sans, arial, sans-serif"><span style=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>Performance Testing:</b></div><=
div><div><font size=3D"1">Tests were run on an Intel Core i3 6006U @ 2.0GHz=
</font></div><div><br></div><div>Custom Function (VS 2017) : <div class=3D"=
prettyprint" style=3D"background-color: rgb(250, 250, 250); border-color: r=
gb(187, 187, 187); border-style: solid; border-width: 1px; overflow-wrap: b=
reak-word;"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span=
 style=3D"color: #000;" class=3D"styled-by-prettify">__declspec</span><span=
 style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify">naked</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">)</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> __int32 __fastcall powi</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">(</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify">__int32 </span><span style=3D"color: #00=
8;" class=3D"styled-by-prettify">base</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> __int32 exp</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">)</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> __asm =
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">{</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">...</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"style=
d-by-prettify">}</span></div></code></div></div><div><br></div><div>Test Ra=
nge:</div><blockquote style=3D"margin: 0 0 0 40px; border: none; padding: 0=
px;"><div>base: [-46340, 46340]=C2=A0 (int-truncation of the sqrt of MAX_IN=
T)</div></blockquote><blockquote style=3D"margin: 0 0 0 40px; border: none;=
 padding: 0px;">exp: [-19, 19] (highest power of 3, that does not overflow =
the int type)</blockquote><div><br></div><div>Results: (Approx. x20 avg. im=
provement)</div><p class=3D"separator" style=3D"text-align: left; clear: bo=
th;"><img src=3D"cid:8babe2aa-8688-46ef-8cca-eca48b935eda" alt=3D"Untitled.=
png" width=3D"320" height=3D"183" style=3D"margin-left: 1em; margin-right: =
1em;"></p><p class=3D"separator" style=3D"text-align: left; clear: both;"><=
br></p><p class=3D"separator" style=3D"text-align: left; clear: both;"><b>P=
ossible Use-Cases:</b></p><p class=3D"separator" style=3D"text-align: left;=
 clear: both;">Allocation of N-dimensional arrays, 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">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/fbfec82c-5416-4c96-b53b-ef3d4309b613%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/fbfec82c-5416-4c96-b53b-ef3d4309b613=
%40isocpp.org</a>.<br />

------=_Part_160_1686897718.1547740933607--

------=_Part_159_387068105.1547740933607
Content-Type: image/png; name=Untitled.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=Untitled.png
X-Attachment-Id: 8babe2aa-8688-46ef-8cca-eca48b935eda
Content-ID: <8babe2aa-8688-46ef-8cca-eca48b935eda>

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
AElFTkSuQmCC
------=_Part_159_387068105.1547740933607--

.


Author: Dilip Ranganathan <misc.usage@gmail.com>
Date: Thu, 17 Jan 2019 11:06:11 -0500
Raw View
--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--

.


Author: joel.g.hemphill@gmail.com
Date: Fri, 18 Jan 2019 10:12:53 -0800 (PST)
Raw View
------=_Part_1072_176754651.1547835173821
Content-Type: multipart/alternative;
 boundary="----=_Part_1073_35091478.1547835173822"

------=_Part_1073_35091478.1547835173822
Content-Type: text/plain; charset="UTF-8"

To amend the graph given; I have discovered a mistake in my timing code.
After fixing said mistake, the graph no-longer shows O(log(n)) complexity
for either function with positive powers. The 20x improvement in
performance is still present. I know that this doesn't effect the primary
points of the proposal, but I just wanted to clarify a bit of information.

On Thursday, January 17, 2019 at 8:02:13 AM UTC-8, joel.g....@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/f45294da-8e0b-4e2c-aa9d-e9b3f36371b5%40isocpp.org.

------=_Part_1073_35091478.1547835173822
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">To amend the graph given; I have discovered a mistake in m=
y timing code. After fixing said mistake, the graph no-longer shows O(log(n=
)) complexity for either function with positive powers. The 20x improvement=
 in performance is still present. I know that this doesn&#39;t effect the p=
rimary points of the proposal, but I just wanted to clarify a bit of inform=
ation.<div><br>On Thursday, January 17, 2019 at 8:02:13 AM UTC-8, joel.g...=
..@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;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" rel=
=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://www.google.com/url?q\=
x3dhttps%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Fnumeric%2Fmath%2Fpow\x26sa=
\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF58qoLigGYXuRNd7iC7b_Cp3V1aA&#39;;return=
 true;" onclick=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%3=
A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Fnumeric%2Fmath%2Fpow\x26sa\x3dD\x26s=
ntz\x3d1\x26usg\x3dAFQjCNF58qoLigGYXuRNd7iC7b_Cp3V1aA&#39;;return true;">ht=
tps://en.cppreference.com/<wbr>w/cpp/numeric/math/pow</a>), integral types =
can be used as parameters, but they will be cast to double before calculati=
on. I believe that an integral-specific overload should be made, which make=
s use of faster integer-operations available to CPUs.<div><br></div><div>As=
 a disclaimer, I am still a rather inexperienced programmer (College Sophom=
ore), and I my have some misunderstands as to what would fall under the ISO=
 standard and what would fall under compiler-implementations. As I understa=
nd it, the line about &quot;<span style=3D"color:rgb(0,0,0);font-family:Dej=
aVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.8px">If any a=
rgument 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.8p=
x">it is cast to double.&quot; is a component of the ISO standard.</span></=
div><div><span style=3D"color:rgb(0,0,0);font-family:DejaVuSans,&quot;DejaV=
u 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-family:DejaVuSans=
,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.8px">As stated on <a=
 href=3D"http://isocpp.org" target=3D"_blank" rel=3D"nofollow" onmousedown=
=3D"this.href=3D&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Fisocpp.org=
\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHaIcX84r8AUHgx9Q4pR00LZ1llsQ&#39;;=
return true;" onclick=3D"this.href=3D&#39;http://www.google.com/url?q\x3dht=
tp%3A%2F%2Fisocpp.org\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHaIcX84r8AUHg=
x9Q4pR00LZ1llsQ&#39;;return true;">isocpp.org</a>&#39;s FAQ section, this i=
dea 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-isnt-int-powint-base-int-e=
xponent-in-the-standard-c-libraries" style=3D"font-size:12.8px" target=3D"_=
blank" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://www.google.=
com/url?q\x3dhttps%3A%2F%2Fstackoverflow.com%2Fquestions%2F2398442%2Fwhy-is=
nt-int-powint-base-int-exponent-in-the-standard-c-libraries\x26sa\x3dD\x26s=
ntz\x3d1\x26usg\x3dAFQjCNHWzh0WCiD6kSmtYt-R3r1LOBIlPw&#39;;return true;" on=
click=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fsta=
ckoverflow.com%2Fquestions%2F2398442%2Fwhy-isnt-int-powint-base-int-exponen=
t-in-the-standard-c-libraries\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHWzh0=
WCiD6kSmtYt-R3r1LOBIlPw&#39;;return true;">https://stackoverflow.com/<wbr>q=
uestions/2398442/why-isnt-<wbr>int-powint-base-int-exponent-<wbr>in-the-sta=
ndard-c-libraries</a><span style=3D"font-size:12.8px">), multiple implement=
ations=C2=A0of this function have been made on a per-user basis, due to its=
 general simplicity and lack of inclusion in previous standards. In the bel=
ow testing, I created a function using x86 asm. It is worth noting that eve=
n with more standard C++ approaches, as testified in the stackoverflow disc=
ussion above, a significant performance improvement can be made.</span></fo=
nt></div><div style=3D"text-indent:0px"><font color=3D"#000000" face=3D"Dej=
aVuSans, 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"#00000=
0" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><span style=3D"font-=
size:12.8px">For the sake of brevity, the data-table and source have been w=
ithheld, but if it is relevant=C2=A0to the conversation, I would be more th=
an willing to provide them.</span></font></div><div style=3D"text-indent:0p=
x"><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-ser=
if"><span style=3D"font-size:12.8px"><br></span></font></div><div style=3D"=
text-indent:0px"><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, a=
rial, sans-serif"><span style=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>Performance Testing:</b></div><div><div><font size=
=3D"1">Tests were run on an Intel Core i3 6006U @ 2.0GHz</font></div><div><=
br></div><div>Custom Function (VS 2017) : <div style=3D"background-color:rg=
b(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-widt=
h:1px"><code><div><span style=3D"color:#000">__declspec</span><span style=
=3D"color:#660">(</span><span style=3D"color:#000">naked</span><span style=
=3D"color:#660">)</span><span style=3D"color:#000"> __int32 __fastcall powi=
</span><span style=3D"color:#660">(</span><span style=3D"color:#000">__int3=
2 </span><span style=3D"color:#008">base</span><span style=3D"color:#660">,=
</span><span style=3D"color:#000"> __int32 exp</span><span style=3D"color:#=
660">)</span><span style=3D"color:#000"> </span><span style=3D"color:#660">=
{</span><span style=3D"color:#000"> __asm </span><span style=3D"color:#660"=
>{</span><span style=3D"color:#000"> </span><span style=3D"color:#660">...<=
/span><span style=3D"color:#000"> </span><span style=3D"color:#660">}</span=
><span style=3D"color:#000"> </span><span style=3D"color:#660">}</span></di=
v></code></div></div><div><br></div><div>Test Range:</div><blockquote style=
=3D"margin:0 0 0 40px;border:none;padding:0px"><div>base: [-46340, 46340]=
=C2=A0 (int-truncation of the sqrt of MAX_INT)</div></blockquote><blockquot=
e style=3D"margin:0 0 0 40px;border:none;padding:0px">exp: [-19, 19] (highe=
st power of 3, that does not overflow the int type)</blockquote><div><br></=
div><div>Results: (Approx. x20 avg. improvement)</div><p style=3D"text-alig=
n:left;clear:both"><img src=3D"https://groups.google.com/a/isocpp.org/group=
/std-proposals/attach/13eb89bedb9e8f/Untitled.png?part=3D0.1&amp;view=3D1&a=
mp;authuser=3D2" alt=3D"Untitled.png" width=3D"320" height=3D"183" style=3D=
"margin-left:1em;margin-right:1em"></p><p style=3D"text-align:left;clear:bo=
th"><br></p><p style=3D"text-align:left;clear:both"><b>Possible Use-Cases:<=
/b></p><p style=3D"text-align:left;clear:both">Allocation of N-dimensional =
arrays, with N^M elements.</p></div></div></blockquote></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">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/f45294da-8e0b-4e2c-aa9d-e9b3f36371b5%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/f45294da-8e0b-4e2c-aa9d-e9b3f36371b5=
%40isocpp.org</a>.<br />

------=_Part_1073_35091478.1547835173822--

------=_Part_1072_176754651.1547835173821--

.


Author: joel.g.hemphill@gmail.com
Date: Fri, 18 Jan 2019 10:17:27 -0800 (PST)
Raw View
------=_Part_1034_616440545.1547835447667
Content-Type: multipart/alternative;
 boundary="----=_Part_1035_1172686801.1547835447667"

------=_Part_1035_1172686801.1547835447667
Content-Type: text/plain; charset="UTF-8"

Thanks for the positive feedback. I will admit, there was a certain amount
of doubt when I was first considering pushing for this. It felt like every
good suggestion had already been made and considered; To a certain extent,
I had considered the STL holy. That's not to say I don't understand some of
the rationale behind this optimization's inclusion. Bloat is a major design
constraint.

On Thursday, January 17, 2019 at 8:06:25 AM UTC-8, Dilip R wrote:
>
> 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.
>

--
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/d0809e24-10f9-4def-a95a-7756424caf02%40isocpp.org.

------=_Part_1035_1172686801.1547835447667
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Thanks for the positive feedback. I will admit, there was =
a certain amount of doubt when I was first considering pushing for this. It=
 felt like every good suggestion had already been made and considered; To a=
 certain extent, I had considered the STL holy. That&#39;s not to say I don=
&#39;t understand some of the rationale behind this optimization&#39;s incl=
usion. Bloat is a major design constraint.<br><br>On Thursday, January 17, =
2019 at 8:06:25 AM UTC-8, Dilip R wrote:<blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-le=
ft: 1ex;"><div dir=3D"ltr">I am just writing to=C2=A0+1 this. I have long w=
ondered why 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 some=
thing blindingly obvious.<div><br></div><div>Thanks Joel for taking that ba=
ton.</div></div>
</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/d0809e24-10f9-4def-a95a-7756424caf02%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/d0809e24-10f9-4def-a95a-7756424caf02=
%40isocpp.org</a>.<br />

------=_Part_1035_1172686801.1547835447667--

------=_Part_1034_616440545.1547835447667--

.


Author: Arthur O'Dwyer <arthur.j.odwyer@gmail.com>
Date: Fri, 18 Jan 2019 14:38:49 -0800 (PST)
Raw View
------=_Part_1127_813155791.1547851129276
Content-Type: multipart/alternative;
 boundary="----=_Part_1128_1455883637.1547851129277"

------=_Part_1128_1455883637.1547851129277
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thursday, January 17, 2019 at 11:02:13 AM UTC-5, joel.g....@gmail.com=20
wrote:
>
> As of C++11, per overload 7 of the 'pow' function (
> https://en.cppreference.com/w/cpp/numeric/math/pow), integral types can=
=20
> be used as parameters, but they will be cast to double before calculation=
..=20
> I believe that an integral-specific overload should be made, which makes=
=20
> use of faster integer-operations available to CPUs.
>
> As a disclaimer, I am still a rather inexperienced programmer (College=20
> Sophomore), and I my have some misunderstands as to what would fall under=
=20
> the ISO standard and what would fall under compiler-implementations. As I=
=20
> understand it, the line about "If any argument has integral type, it is=
=20
> cast to double." is a component of the ISO standard.
>
> As stated on isocpp.org's FAQ section, this idea is based on existing=20
> practices. As discussed here (
> https://stackoverflow.com/questions/2398442/why-isnt-int-powint-base-int-=
exponent-in-the-standard-c-libraries),=20
> multiple implementations of this function have been made on a per-user=20
> basis, due to its general simplicity and lack of inclusion in previous=20
> standards. In the below testing, I created a function using x86 asm. It i=
s=20
> worth noting that even with more standard C++ approaches, as testified in=
=20
> the stackoverflow discussion above, a significant performance improvement=
=20
> can be made.
>
> For the sake of brevity, the data-table and source have been withheld, bu=
t=20
> if it is relevant to the conversation, I would be more than willing to=20
> 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) :=20
> __declspec(naked) __int32 __fastcall powi(__int32 base, __int32 exp) {=20
> __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]
>
>
>
I am skeptical of this graph's reality. It looks too neat to me, with an=20
identical dip at n^0 and a constant gap between the two lines even on a log=
=20
scale. (I could believe a constant gap on a linear scale, if what we were=
=20
witnessing is the constant cost of two int-to-double conversions. But not a=
=20
constant gap on a log scale!)
Do you have a link to your exact test cases and the software that produced=
=20
this graph, such that other people could reproduce your experiment from=20
scratch on their own hardware?

Another thing that makes me skeptical of this graph is the weirdly constant=
=20
and very low latencies for n^-19 through n^-1 (which are displayed as -n^19=
=20
to -n^1 on the X-axis, but I assume that's a typo).  Solving n^-19 (a.k.a.=
=20
1/n^19) in integers is just "return (n =3D=3D 1) ? 1 : (n =3D=3D -1) ? -1 :=
 0;",=20
right? Whereas solving n^-19 in floating-point ought to require the exact=
=20
same "log, multiply, exp" that would be required for n^19.

As for adding a new overload of std::pow =E2=80=94 no, you'll never get awa=
y with=20
that.

    double x =3D std::pow(10, 20);

currently has well-defined behavior =E2=80=94 it yields 1e+20.  You're prop=
osing to=20
make it have undefined behavior instead.  I don't think that's going to fly=
..

You'd have better luck asking GCC and Clang to optimize `__builtin_pow` for=
=20
small integers. Which I think they might already do?
https://godbolt.org/z/7lPPLf
Looks like maybe they special-case std::pow(1, n) but nothing else.

HTH,
Arthur

--=20
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 e=
mail 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/c5128f98-b764-4576-90fc-eda8d40d980e%40isocpp.or=
g.

------=_Part_1128_1455883637.1547851129277
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Thursday, January 17, 2019 at 11:02:13 AM UTC-5, joel.g=
.....@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;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" r=
el=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://www.google.com/url?=
q\x3dhttps%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Fnumeric%2Fmath%2Fpow\x26=
sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF58qoLigGYXuRNd7iC7b_Cp3V1aA&#39;;retu=
rn true;" onclick=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps=
%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Fnumeric%2Fmath%2Fpow\x26sa\x3dD\x2=
6sntz\x3d1\x26usg\x3dAFQjCNF58qoLigGYXuRNd7iC7b_Cp3V1aA&#39;;return true;">=
https://en.cppreference.com/<wbr>w/cpp/numeric/math/pow</a>), integral type=
s can be used as parameters, but they will be cast to double before calcula=
tion. I believe that an integral-specific overload should be made, which ma=
kes use of faster integer-operations available to CPUs.<div><br></div><div>=
As a disclaimer, I am still a rather inexperienced programmer (College Soph=
omore), and I my have some misunderstands as to what would fall under the I=
SO standard and what would fall under compiler-implementations. As I unders=
tand it, the line about &quot;<span style=3D"color:rgb(0,0,0);font-family:D=
ejaVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.8px">If any=
 argument has integral type,=C2=A0</span><span style=3D"color:rgb(0,0,0);fo=
nt-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 standard.</span>=
</div><div><span style=3D"color:rgb(0,0,0);font-family:DejaVuSans,&quot;Dej=
aVu Sans&quot;,arial,sans-serif;font-size:12.8px"><br></span></div><div sty=
le=3D"text-indent:0px"><span style=3D"color:rgb(0,0,0);font-family:DejaVuSa=
ns,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.8px">As stated on =
<a href=3D"http://isocpp.org" target=3D"_blank" rel=3D"nofollow" onmousedow=
n=3D"this.href=3D&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Fisocpp.or=
g\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHaIcX84r8AUHgx9Q4pR00LZ1llsQ&#39;=
;return true;" onclick=3D"this.href=3D&#39;http://www.google.com/url?q\x3dh=
ttp%3A%2F%2Fisocpp.org\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHaIcX84r8AUH=
gx9Q4pR00LZ1llsQ&#39;;return true;">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-isnt-int-powint-base-int-e=
xponent-in-the-standard-c-libraries" style=3D"font-size:12.8px" target=3D"_=
blank" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://www.google.=
com/url?q\x3dhttps%3A%2F%2Fstackoverflow.com%2Fquestions%2F2398442%2Fwhy-is=
nt-int-powint-base-int-exponent-in-the-standard-c-libraries\x26sa\x3dD\x26s=
ntz\x3d1\x26usg\x3dAFQjCNHWzh0WCiD6kSmtYt-R3r1LOBIlPw&#39;;return true;" on=
click=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fsta=
ckoverflow.com%2Fquestions%2F2398442%2Fwhy-isnt-int-powint-base-int-exponen=
t-in-the-standard-c-libraries\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHWzh0=
WCiD6kSmtYt-R3r1LOBIlPw&#39;;return true;">https://stackoverflow.com/<wbr>q=
uestions/2398442/why-isnt-<wbr>int-powint-base-int-exponent-<wbr>in-the-sta=
ndard-c-libraries</a><span style=3D"font-size:12.8px">), multiple implement=
ations=C2=A0of this function have been made on a per-user basis, due to its=
 general simplicity and lack of inclusion in previous standards. In the bel=
ow testing, I created a function using x86 asm. It is worth noting that eve=
n with more standard C++ approaches, as testified in the stackoverflow disc=
ussion above, a significant performance improvement can be made.</span></fo=
nt></div><div style=3D"text-indent:0px"><font color=3D"#000000" face=3D"Dej=
aVuSans, 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"#00000=
0" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><span style=3D"font-=
size:12.8px">For the sake of brevity, the data-table and source have been w=
ithheld, but if it is relevant=C2=A0to the conversation, I would be more th=
an willing to provide them.</span></font></div><div style=3D"text-indent:0p=
x"><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-ser=
if"><span style=3D"font-size:12.8px"><br></span></font></div><div style=3D"=
text-indent:0px"><font color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, a=
rial, sans-serif"><span style=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>Performance Testing:</b></div><div><div><font size=
=3D"1">Tests were run on an Intel Core i3 6006U @ 2.0GHz</font></div><div><=
br></div><div>Custom Function (VS 2017) : <div style=3D"background-color:rg=
b(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-widt=
h:1px"><code><div><span style=3D"color:#000">__declspec</span><span style=
=3D"color:#660">(</span><span style=3D"color:#000">naked</span><span style=
=3D"color:#660">)</span><span style=3D"color:#000"> __int32 __fastcall powi=
</span><span style=3D"color:#660">(</span><span style=3D"color:#000">__int3=
2 </span><span style=3D"color:#008">base</span><span style=3D"color:#660">,=
</span><span style=3D"color:#000"> __int32 exp</span><span style=3D"color:#=
660">)</span><span style=3D"color:#000"> </span><span style=3D"color:#660">=
{</span><span style=3D"color:#000"> __asm </span><span style=3D"color:#660"=
>{</span><span style=3D"color:#000"> </span><span style=3D"color:#660">...<=
/span><span style=3D"color:#000"> </span><span style=3D"color:#660">}</span=
><span style=3D"color:#000"> </span><span style=3D"color:#660">}</span></di=
v></code></div></div><div><br></div><div>Test Range:</div><blockquote style=
=3D"margin:0 0 0 40px;border:none;padding:0px"><div>base: [-46340, 46340]=
=C2=A0 (int-truncation of the sqrt of MAX_INT)</div></blockquote><blockquot=
e style=3D"margin:0 0 0 40px;border:none;padding:0px">exp: [-19, 19] (highe=
st power of 3, that does not overflow the int type)</blockquote><div><br></=
div><div>Results: (Approx. x20 avg. improvement)</div><p style=3D"text-alig=
n:left;clear:both"><img src=3D"https://groups.google.com/a/isocpp.org/group=
/std-proposals/attach/13eb89bedb9e8f/Untitled.png?part=3D0.1&amp;view=3D1&a=
mp;authuser=3D0" alt=3D"Untitled.png" width=3D"320" height=3D"183" style=3D=
"margin-left:1em;margin-right:1em"></p><p style=3D"text-align:left;clear:bo=
th"><br></p></div></div></blockquote><div><br></div><div>I am skeptical of =
this graph&#39;s reality. It looks too neat to me, with an identical dip at=
 n^0 and a constant gap between the two lines even on a log scale. (I could=
 believe a constant gap on a linear scale, if what we were witnessing is th=
e constant cost of two int-to-double conversions. But not a constant gap on=
 a log scale!)</div><div>Do you have a link to your exact test cases and th=
e software that produced this graph, such that other people could reproduce=
 your experiment from scratch on their own hardware?</div><div><br></div><d=
iv>Another thing that makes me skeptical of this graph is the weirdly const=
ant and very low latencies for n^-19 through n^-1 (which are displayed as -=
n^19 to -n^1 on the X-axis, but I assume that&#39;s a typo). =C2=A0Solving =
n^-19 (a.k.a. 1/n^19) in integers is just &quot;return (n =3D=3D 1) ? 1 : (=
n =3D=3D -1) ? -1 : 0;&quot;, right? Whereas solving n^-19 in floating-poin=
t ought to require the exact same &quot;log, multiply, exp&quot; that would=
 be required for n^19.</div><div><br></div><div>As for adding a new overloa=
d of std::pow =E2=80=94 no, you&#39;ll never get away with that.</div><div>=
<br></div><div>=C2=A0 =C2=A0 double x =3D std::pow(10, 20);<br></div><div><=
br></div><div>currently has well-defined behavior =E2=80=94 it yields 1e+20=
.. =C2=A0You&#39;re proposing to make it have undefined behavior instead. =
=C2=A0I don&#39;t think that&#39;s going to fly.</div><div><br></div><div>Y=
ou&#39;d have better luck asking GCC and Clang to optimize `__builtin_pow` =
for small integers. Which I think they might already do?</div><div><a href=
=3D"https://godbolt.org/z/7lPPLf">https://godbolt.org/z/7lPPLf</a><br></div=
><div>Looks like maybe they special-case std::pow(1, n) but nothing else.</=
div><div><br></div><div>HTH,</div><div>Arthur</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">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/c5128f98-b764-4576-90fc-eda8d40d980e%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/c5128f98-b764-4576-90fc-eda8d40d980e=
%40isocpp.org</a>.<br />

------=_Part_1128_1455883637.1547851129277--

------=_Part_1127_813155791.1547851129276--

.


Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Fri, 18 Jan 2019 15:42:18 -0800 (PST)
Raw View
------=_Part_1095_2073383179.1547854938862
Content-Type: text/plain; charset="UTF-8"

I agree on that - but I also dislike like the unnecessary abbreviation "pow", so I'd propose a templated function std::power, maybe with a default for unsigned integral powers if T operator*(T const&, T const&) exists.

Even better, an operator for it instead (e.g. ^^, as ** introduces ambiguities).

--
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/e9d08680-2afe-45b3-a95c-ac9ddc2ef386%40isocpp.org.

------=_Part_1095_2073383179.1547854938862--

.


Author: joel.g.hemphill@gmail.com
Date: Fri, 18 Jan 2019 17:12:17 -0800 (PST)
Raw View
------=_Part_1242_234203149.1547860338011
Content-Type: multipart/alternative;
 boundary="----=_Part_1243_674698673.1547860338012"

------=_Part_1243_674698673.1547860338012
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

The case you pointed out of using the double-type of the return for=20
'pow(int, int)' would be a major concern. Perhaps a workaround would be the=
=20
requirement of an explicit template? i.e. "double x =3D std::pow(10, 20);"=
=20
would use overload 7, whereas "std::pow<int, int>(10, 20)" would return=20
int? Alternatively, as Jake Arkinstall suggested, a new syntax for 'pow' as=
=20
'power' might be in order, in which case, such contingencies wouldn't be as=
=20
large a concern. I would also argue that the above code segment is poor=20
practice, as it is relying upon the pow function to convert the two=20
integers to doubles. More explicit typing would be preferred in most coding=
=20
environments. Another solution, as is implemented with powl and powf, is to=
=20
use a single-letter abbreviation to explicitly define the types used. i.e.=
=20
powi.

As for the graph; I mentioned in a reply to my original posting that I have=
=20
since found an issue with the testing method I used for graphing the=20
execution times for pow and powi. I have since done other tests as shown=20
below [avg. of 20000 runs for powi, and 500 for pow (since the execution is=
=20
longer, I decided to neglect the sample-count somewhat)]:

[image: Untitled2.png]


As you can see, powi does experience a gradual increase in execution length=
=20
with the increasing exponents (since it needs to do at worst [if an=20
implementation were to use a simple linear approach, O(n) multiplications])=
..


While the normal method does appear to be O(1), the execution lengths for=
=20
floating-point operations are significant enough to negate those benefits=
=20
with the ranges of 32 and 64-bit integer types.


Also below, I have included the collected data, which was gathered using=20
"std::chrono::high_resolution_clock::now()" surrounding for-loops executing=
=20
the functions within the base-value ranges for each exponent.


Power STL Custom=20
> -19 152.4881 5.922077=20
> -18 156.3487 5.497594=20
> -17 141.8481 5.546061=20
> -16 145.8614 5.683295=20
> -15 145.8326 6.041384=20
> -14 149.2215 5.701708=20
> -13 145.5323 5.59141=20
> -12 149.3403 5.602157=20
> -11 146.3427 5.974374=20
> -10 152.5245 6.180647=20
> -9 146.4068 5.772337=20
> -8 143.3287 5.782097=20
> -7 152.735 5.678149=20
> -6 146.4267 5.743723=20
> -5 145.5064 5.750488=20
> -4 150.1708 5.772985=20
> -3 142.524 6.569755=20
> -2 140.4772 5.600695=20
> -1 143.6424 6.281142=20
> 0 107.1507 3.854533=20
> 1 140.658 6.386001=20
> 2 147.3853 6.076429=20
> 3 146.9267 8.102243=20
> 4 141.4524 6.984409=20
> 5 136.9645 10.44516=20
> 6 139.3443 8.883989=20
> 7 142.125 7.988396=20
> 8 141.0955 7.625333=20
> 9 140.6131 12.97227=20
> 10 138.1168 11.3224=20
> 11 143.1305 10.61643=20
> 12 139.4992 10.38626=20
> 13 141.5211 11.2896=20
> 14 141.0866 10.22915=20
> 15 140.7223 9.948738=20
> 16 139.7512 9.173968=20
> 17 138.1409 15.03408=20
> 18 141.6834 13.97868=20
> 19 153.7554 14.77899=20



On Friday, January 18, 2019 at 2:38:49 PM UTC-8, Arthur O'Dwyer wrote:
>
> On Thursday, January 17, 2019 at 11:02:13 AM UTC-5, joel.g....@gmail.com=
=20
> wrote:
>>
>> As of C++11, per overload 7 of the 'pow' function (
>> https://en.cppreference.com/w/cpp/numeric/math/pow), integral types can=
=20
>> be used as parameters, but they will be cast to double before calculatio=
n.=20
>> I believe that an integral-specific overload should be made, which makes=
=20
>> use of faster integer-operations available to CPUs.
>>
>> As a disclaimer, I am still a rather inexperienced programmer (College=
=20
>> Sophomore), and I my have some misunderstands as to what would fall unde=
r=20
>> the ISO standard and what would fall under compiler-implementations. As =
I=20
>> understand it, the line about "If any argument has integral type, it is=
=20
>> cast to double." is a component of the ISO standard.
>>
>> As stated on isocpp.org's FAQ section, this idea is based on existing=20
>> practices. As discussed here (
>> https://stackoverflow.com/questions/2398442/why-isnt-int-powint-base-int=
-exponent-in-the-standard-c-libraries),=20
>> multiple implementations of this function have been made on a per-user=
=20
>> basis, due to its general simplicity and lack of inclusion in previous=
=20
>> standards. In the below testing, I created a function using x86 asm. It =
is=20
>> worth noting that even with more standard C++ approaches, as testified i=
n=20
>> the stackoverflow discussion above, a significant performance improvemen=
t=20
>> can be made.
>>
>> For the sake of brevity, the data-table and source have been withheld,=
=20
>> but if it is relevant to the conversation, I would be more than willing =
to=20
>> 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) :=20
>> __declspec(naked) __int32 __fastcall powi(__int32 base, __int32 exp) {=
=20
>> __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]
>>
>>
>>
> I am skeptical of this graph's reality. It looks too neat to me, with an=
=20
> identical dip at n^0 and a constant gap between the two lines even on a l=
og=20
> scale. (I could believe a constant gap on a linear scale, if what we were=
=20
> witnessing is the constant cost of two int-to-double conversions. But not=
 a=20
> constant gap on a log scale!)
> Do you have a link to your exact test cases and the software that produce=
d=20
> this graph, such that other people could reproduce your experiment from=
=20
> scratch on their own hardware?
>
> Another thing that makes me skeptical of this graph is the weirdly=20
> constant and very low latencies for n^-19 through n^-1 (which are display=
ed=20
> as -n^19 to -n^1 on the X-axis, but I assume that's a typo).  Solving n^-=
19=20
> (a.k.a. 1/n^19) in integers is just "return (n =3D=3D 1) ? 1 : (n =3D=3D =
-1) ? -1 :=20
> 0;", right? Whereas solving n^-19 in floating-point ought to require the=
=20
> exact same "log, multiply, exp" that would be required for n^19.
>
> As for adding a new overload of std::pow =E2=80=94 no, you'll never get a=
way with=20
> that.
>
>     double x =3D std::pow(10, 20);
>
> currently has well-defined behavior =E2=80=94 it yields 1e+20.  You're pr=
oposing=20
> to make it have undefined behavior instead.  I don't think that's going t=
o=20
> fly.
>
> You'd have better luck asking GCC and Clang to optimize `__builtin_pow`=
=20
> for small integers. Which I think they might already do?
> https://godbolt.org/z/7lPPLf
> Looks like maybe they special-case std::pow(1, n) but nothing else.
>
> HTH,
> Arthur
>

--=20
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 e=
mail 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/1d2bd16a-c2f9-4baa-b2d3-4b0241de8992%40isocpp.or=
g.

------=_Part_1243_674698673.1547860338012
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">The case you pointed out of using the double-type of the r=
eturn for &#39;pow(int, int)&#39; would be a major concern. Perhaps a worka=
round would be the requirement of an explicit template? i.e. &quot;double x=
 =3D std::pow(10, 20);&quot; would use overload 7, whereas &quot;std::pow&l=
t;int, int&gt;(10, 20)&quot; would return int? Alternatively, as Jake Arkin=
stall suggested, a new syntax for &#39;pow&#39; as &#39;power&#39; might be=
 in order, in which case, such contingencies wouldn&#39;t be as large a con=
cern. I would also argue that the above code segment is poor practice, as i=
t is relying upon the pow function to convert the two integers to doubles. =
More explicit typing would be preferred in most coding environments. Anothe=
r solution, as is implemented with powl and powf, is to use a single-letter=
 abbreviation to explicitly define the types used. i.e. powi.<div><br></div=
><div>As for the graph; I mentioned in a reply to my original posting that =
I have since found an issue with the testing method I used for graphing the=
 execution times for pow and powi. I have since done other tests as shown b=
elow [avg. of 20000 runs for powi, and 500 for pow (since the execution is =
longer, I decided to neglect the sample-count somewhat)]:</div><div><br></d=
iv><p class=3D"separator" style=3D"text-align: left; clear: both;"><img src=
=3D"cid:48451991-147f-4022-b5a2-fd68fb1a3cbe" alt=3D"Untitled2.png" width=
=3D"320" height=3D"183" style=3D"margin-left: 1em; margin-right: 1em;"></p>=
<p class=3D"separator" style=3D"text-align: left; clear: both;"><br></p><p =
class=3D"separator" style=3D"text-align: left; clear: both;">As you can see=
, powi does experience a gradual increase in execution length with the incr=
easing exponents (since it needs to do at worst [if an implementation were =
to use a simple linear approach, O(n) multiplications]).</p><p class=3D"sep=
arator" style=3D"text-align: left; clear: both;"><br></p><p class=3D"separa=
tor" style=3D"text-align: left; clear: both;">While the normal method does =
appear to be O(1), the execution lengths for floating-point operations are =
significant enough to negate those benefits with the ranges of 32 and 64-bi=
t integer types.</p><p class=3D"separator" style=3D"text-align: left; clear=
: both;"><br></p><p class=3D"separator" style=3D"text-align: left; clear: b=
oth;">Also below, I have included the collected data, which was gathered us=
ing &quot;std::chrono::high_resolution_clock::now()&quot; surrounding for-l=
oops executing the functions within the base-value ranges for each exponent=
..</p><p class=3D"separator" style=3D"text-align: left; clear: both;"><br></=
p><blockquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; bor=
der-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><table border=
=3D"0" cellpadding=3D"0" cellspacing=3D"0" width=3D"175" style=3D"border-co=
llapse:
 collapse;width:131pt">
 <colgroup><col width=3D"47" style=3D"mso-width-source:userset;mso-width-al=
t:1718;width:35pt">
 <col width=3D"64" span=3D"2" style=3D"width:48pt">
 </colgroup><tbody><tr height=3D"18" style=3D"mso-height-source:userset;hei=
ght:13.5pt">
  <td height=3D"18" width=3D"47" style=3D"height:13.5pt;width:35pt">Power</=
td>
  <td width=3D"64" style=3D"width:48pt">STL</td>
  <td width=3D"64" style=3D"width:48pt">Custom</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-19</td>
  <td align=3D"right">152.4881</td>
  <td align=3D"right">5.922077</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-18</td>
  <td align=3D"right">156.3487</td>
  <td align=3D"right">5.497594</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-17</td>
  <td align=3D"right">141.8481</td>
  <td align=3D"right">5.546061</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-16</td>
  <td align=3D"right">145.8614</td>
  <td align=3D"right">5.683295</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-15</td>
  <td align=3D"right">145.8326</td>
  <td align=3D"right">6.041384</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-14</td>
  <td align=3D"right">149.2215</td>
  <td align=3D"right">5.701708</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-13</td>
  <td align=3D"right">145.5323</td>
  <td align=3D"right">5.59141</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-12</td>
  <td align=3D"right">149.3403</td>
  <td align=3D"right">5.602157</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-11</td>
  <td align=3D"right">146.3427</td>
  <td align=3D"right">5.974374</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-10</td>
  <td align=3D"right">152.5245</td>
  <td align=3D"right">6.180647</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-9</td>
  <td align=3D"right">146.4068</td>
  <td align=3D"right">5.772337</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-8</td>
  <td align=3D"right">143.3287</td>
  <td align=3D"right">5.782097</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-7</td>
  <td align=3D"right">152.735</td>
  <td align=3D"right">5.678149</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-6</td>
  <td align=3D"right">146.4267</td>
  <td align=3D"right">5.743723</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-5</td>
  <td align=3D"right">145.5064</td>
  <td align=3D"right">5.750488</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-4</td>
  <td align=3D"right">150.1708</td>
  <td align=3D"right">5.772985</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-3</td>
  <td align=3D"right">142.524</td>
  <td align=3D"right">6.569755</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-2</td>
  <td align=3D"right">140.4772</td>
  <td align=3D"right">5.600695</td>
 </tr>
 <tr height=3D"20" style=3D"mso-height-source:userset;height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">-1</td>
  <td align=3D"right">143.6424</td>
  <td align=3D"right">6.281142</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">0</td>
  <td align=3D"right">107.1507</td>
  <td align=3D"right">3.854533</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">1</td>
  <td align=3D"right">140.658</td>
  <td align=3D"right">6.386001</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">2</td>
  <td align=3D"right">147.3853</td>
  <td align=3D"right">6.076429</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">3</td>
  <td align=3D"right">146.9267</td>
  <td align=3D"right">8.102243</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">4</td>
  <td align=3D"right">141.4524</td>
  <td align=3D"right">6.984409</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">5</td>
  <td align=3D"right">136.9645</td>
  <td align=3D"right">10.44516</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">6</td>
  <td align=3D"right">139.3443</td>
  <td align=3D"right">8.883989</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">7</td>
  <td align=3D"right">142.125</td>
  <td align=3D"right">7.988396</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">8</td>
  <td align=3D"right">141.0955</td>
  <td align=3D"right">7.625333</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">9</td>
  <td align=3D"right">140.6131</td>
  <td align=3D"right">12.97227</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">10</td>
  <td align=3D"right">138.1168</td>
  <td align=3D"right">11.3224</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">11</td>
  <td align=3D"right">143.1305</td>
  <td align=3D"right">10.61643</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">12</td>
  <td align=3D"right">139.4992</td>
  <td align=3D"right">10.38626</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">13</td>
  <td align=3D"right">141.5211</td>
  <td align=3D"right">11.2896</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">14</td>
  <td align=3D"right">141.0866</td>
  <td align=3D"right">10.22915</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">15</td>
  <td align=3D"right">140.7223</td>
  <td align=3D"right">9.948738</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">16</td>
  <td align=3D"right">139.7512</td>
  <td align=3D"right">9.173968</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">17</td>
  <td align=3D"right">138.1409</td>
  <td align=3D"right">15.03408</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">18</td>
  <td align=3D"right">141.6834</td>
  <td align=3D"right">13.97868</td>
 </tr>
 <tr height=3D"20" style=3D"height:15.0pt">
  <td height=3D"20" align=3D"right" style=3D"height:15.0pt">19</td>
  <td align=3D"right">153.7554</td>
  <td align=3D"right">14.77899</td>
 </tr></tbody></table></blockquote><div><br><br>On Friday, January 18, 2019=
 at 2:38:49 PM UTC-8, Arthur O&#39;Dwyer wrote:<blockquote class=3D"gmail_q=
uote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pad=
ding-left: 1ex;"><div dir=3D"ltr">On Thursday, January 17, 2019 at 11:02:13=
 AM UTC-5, <a>joel.g....@gmail.com</a> wrote:<blockquote class=3D"gmail_quo=
te" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;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" r=
el=3D"nofollow" target=3D"_blank" onmousedown=3D"this.href=3D&#39;https://w=
ww.google.com/url?q\x3dhttps%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Fnumeri=
c%2Fmath%2Fpow\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF58qoLigGYXuRNd7iC7b=
_Cp3V1aA&#39;;return true;" onclick=3D"this.href=3D&#39;https://www.google.=
com/url?q\x3dhttps%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Fnumeric%2Fmath%2=
Fpow\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF58qoLigGYXuRNd7iC7b_Cp3V1aA&#=
39;;return true;">https://en.cppreference.com/<wbr>w/cpp/numeric/math/pow</=
a>), integral types can be used as parameters, but they will be cast to dou=
ble before calculation. I believe that an integral-specific overload should=
 be made, which makes use of faster integer-operations available to CPUs.<d=
iv><br></div><div>As a disclaimer, I am still a rather inexperienced progra=
mmer (College Sophomore), and I my have some misunderstands as to what woul=
d fall under the ISO standard and what would fall under compiler-implementa=
tions. 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-s=
ize:12.8px">If any argument has integral type,=C2=A0</span><span style=3D"c=
olor:rgb(0,0,0);font-family:DejaVuSans,&quot;DejaVu Sans&quot;,arial,sans-s=
erif;font-size:12.8px">it is cast to double.&quot; is a component of the IS=
O standard.</span></div><div><span style=3D"color:rgb(0,0,0);font-family:De=
jaVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.8px"><br></s=
pan></div><div style=3D"text-indent:0px"><span style=3D"color:rgb(0,0,0);fo=
nt-family:DejaVuSans,&quot;DejaVu Sans&quot;,arial,sans-serif;font-size:12.=
8px">As stated on <a href=3D"http://isocpp.org" rel=3D"nofollow" target=3D"=
_blank" onmousedown=3D"this.href=3D&#39;http://www.google.com/url?q\x3dhttp=
%3A%2F%2Fisocpp.org\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHaIcX84r8AUHgx9=
Q4pR00LZ1llsQ&#39;;return true;" onclick=3D"this.href=3D&#39;http://www.goo=
gle.com/url?q\x3dhttp%3A%2F%2Fisocpp.org\x26sa\x3dD\x26sntz\x3d1\x26usg\x3d=
AFQjCNHaIcX84r8AUHgx9Q4pR00LZ1llsQ&#39;;return true;">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-isnt-int-=
powint-base-int-exponent-in-the-standard-c-libraries" style=3D"font-size:12=
..8px" rel=3D"nofollow" target=3D"_blank" onmousedown=3D"this.href=3D&#39;ht=
tps://www.google.com/url?q\x3dhttps%3A%2F%2Fstackoverflow.com%2Fquestions%2=
F2398442%2Fwhy-isnt-int-powint-base-int-exponent-in-the-standard-c-librarie=
s\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHWzh0WCiD6kSmtYt-R3r1LOBIlPw&#39;=
;return true;" onclick=3D"this.href=3D&#39;https://www.google.com/url?q\x3d=
https%3A%2F%2Fstackoverflow.com%2Fquestions%2F2398442%2Fwhy-isnt-int-powint=
-base-int-exponent-in-the-standard-c-libraries\x26sa\x3dD\x26sntz\x3d1\x26u=
sg\x3dAFQjCNHWzh0WCiD6kSmtYt-R3r1LOBIlPw&#39;;return true;">https://stackov=
erflow.com/<wbr>questions/2398442/why-isnt-<wbr>int-powint-base-int-exponen=
t-<wbr>in-the-standard-c-libraries</a><span style=3D"font-size:12.8px">), m=
ultiple implementations=C2=A0of this function have been made on a per-user =
basis, due to its general simplicity and lack of inclusion in previous stan=
dards. In the below testing, I created a function using x86 asm. It is wort=
h noting that even with more standard C++ approaches, as testified in the s=
tackoverflow discussion above, a significant performance improvement can be=
 made.</span></font></div><div style=3D"text-indent:0px"><font color=3D"#00=
0000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><span style=3D"fo=
nt-size:12.8px"><br></span></font></div><div style=3D"text-indent:0px"><fon=
t color=3D"#000000" face=3D"DejaVuSans, DejaVu Sans, arial, sans-serif"><sp=
an style=3D"font-size:12.8px">For the sake of brevity, the data-table and s=
ource have been withheld, but if it is relevant=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 San=
s, 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"DejaVuSa=
ns, DejaVu Sans, arial, sans-serif"><span style=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>Performance Testing:</b></div><div=
><div><font size=3D"1">Tests were run on an Intel Core i3 6006U @ 2.0GHz</f=
ont></div><div><br></div><div>Custom Function (VS 2017) : <div style=3D"bac=
kground-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:s=
olid;border-width:1px"><code><div><span style=3D"color:#000">__declspec</sp=
an><span style=3D"color:#660">(</span><span style=3D"color:#000">naked</spa=
n><span style=3D"color:#660">)</span><span style=3D"color:#000"> __int32 __=
fastcall powi</span><span style=3D"color:#660">(</span><span style=3D"color=
:#000">__int32 </span><span style=3D"color:#008">base</span><span style=3D"=
color:#660">,</span><span style=3D"color:#000"> __int32 exp</span><span sty=
le=3D"color:#660">)</span><span style=3D"color:#000"> </span><span style=3D=
"color:#660">{</span><span style=3D"color:#000"> __asm </span><span style=
=3D"color:#660">{</span><span style=3D"color:#000"> </span><span style=3D"c=
olor:#660">...</span><span style=3D"color:#000"> </span><span style=3D"colo=
r:#660">}</span><span style=3D"color:#000"> </span><span style=3D"color:#66=
0">}</span></div></code></div></div><div><br></div><div>Test Range:</div><b=
lockquote style=3D"margin:0 0 0 40px;border:none;padding:0px"><div>base: [-=
46340, 46340]=C2=A0 (int-truncation of the sqrt of MAX_INT)</div></blockquo=
te><blockquote style=3D"margin:0 0 0 40px;border:none;padding:0px">exp: [-1=
9, 19] (highest power of 3, that does not overflow the int type)</blockquot=
e><div><br></div><div>Results: (Approx. x20 avg. improvement)</div><p style=
=3D"text-align:left;clear:both"><img src=3D"https://groups.google.com/a/iso=
cpp.org/group/std-proposals/attach/13eb89bedb9e8f/Untitled.png?part=3D0.1&a=
mp;view=3D1&amp;authuser=3D0" alt=3D"Untitled.png" width=3D"320" height=3D"=
183" style=3D"margin-left:1em;margin-right:1em"></p><p style=3D"text-align:=
left;clear:both"><br></p></div></div></blockquote><div><br></div><div>I am =
skeptical of this graph&#39;s reality. It looks too neat to me, with an ide=
ntical dip at n^0 and a constant gap between the two lines even on a log sc=
ale. (I could believe a constant gap on a linear scale, if what we were wit=
nessing is the constant cost of two int-to-double conversions. But not a co=
nstant gap on a log scale!)</div><div>Do you have a link to your exact test=
 cases and the software that produced this graph, such that other people co=
uld reproduce your experiment from scratch on their own hardware?</div><div=
><br></div><div>Another thing that makes me skeptical of this graph is the =
weirdly constant and very low latencies for n^-19 through n^-1 (which are d=
isplayed as -n^19 to -n^1 on the X-axis, but I assume that&#39;s a typo). =
=C2=A0Solving n^-19 (a.k.a. 1/n^19) in integers is just &quot;return (n =3D=
=3D 1) ? 1 : (n =3D=3D -1) ? -1 : 0;&quot;, right? Whereas solving n^-19 in=
 floating-point ought to require the exact same &quot;log, multiply, exp&qu=
ot; that would be required for n^19.</div><div><br></div><div>As for adding=
 a new overload of std::pow =E2=80=94 no, you&#39;ll never get away with th=
at.</div><div><br></div><div>=C2=A0 =C2=A0 double x =3D std::pow(10, 20);<b=
r></div><div><br></div><div>currently has well-defined behavior =E2=80=94 i=
t yields 1e+20. =C2=A0You&#39;re proposing to make it have undefined behavi=
or instead. =C2=A0I don&#39;t think that&#39;s going to fly.</div><div><br>=
</div><div>You&#39;d have better luck asking GCC and Clang to optimize `__b=
uiltin_pow` for small integers. Which I think they might already do?</div><=
div><a href=3D"https://godbolt.org/z/7lPPLf" target=3D"_blank" rel=3D"nofol=
low" onmousedown=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%=
3A%2F%2Fgodbolt.org%2Fz%2F7lPPLf\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF7=
DHgtuBimpaJqB4kbFlq8qen6_w&#39;;return true;" onclick=3D"this.href=3D&#39;h=
ttps://www.google.com/url?q\x3dhttps%3A%2F%2Fgodbolt.org%2Fz%2F7lPPLf\x26sa=
\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF7DHgtuBimpaJqB4kbFlq8qen6_w&#39;;return=
 true;">https://godbolt.org/z/7lPPLf</a><br></div><div>Looks like maybe the=
y special-case std::pow(1, n) but nothing else.</div><div><br></div><div>HT=
H,</div><div>Arthur</div></div></blockquote></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">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/1d2bd16a-c2f9-4baa-b2d3-4b0241de8992%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/1d2bd16a-c2f9-4baa-b2d3-4b0241de8992=
%40isocpp.org</a>.<br />

------=_Part_1243_674698673.1547860338012--

------=_Part_1242_234203149.1547860338011
Content-Type: image/png; name=Untitled2.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=Untitled2.png
X-Attachment-Id: 48451991-147f-4022-b5a2-fd68fb1a3cbe
Content-ID: <48451991-147f-4022-b5a2-fd68fb1a3cbe>

iVBORw0KGgoAAAANSUhEUgAAAfUAAAEfCAIAAADX9ciiAAAYyklEQVR42u3dXY8kV3nAcX8UfwWu
fJcrbgJSRHJBGAVF5gKhCHEDGgSy0MoRG0HA0eBIK4LIIuMQRzAQIDFaI8cKlm2W8Rteg9fGlrN4
gWSJvYbFXu+yMZtnpnqqq+utq6uqX6r691fJ7u2pl1Onu/7nqXNO13PLhQsXXgAAjItw+y3xv5sA
gHERbud3AOB3AAC/AwD4HQDA7wAAfgcAfgcA8DsAgN8BAPwOAOB3AAC/AwC/AwD4HQDA78CquLi/
u7Ozu39RTYDf+X143jm7tzPLZtmsULydnb2z4/L70TFytV9y2jOnf/j31X5QM6XU5PE7Nsc7NTrI
/SkRyyoV2sDvqyvOyr2Z+yDjn/nDl9bAasuZuD1ThsM3Oh1+9e0T+J3fV2/U7fZ7g9Nbu9+Pvms9
fwT8zu9o7vfjgGp6X3/8x9n76qIqClda2a5Lti60MHkP5bWQ7XIornZ8lEbRa/lfZs6kukKqylNa
UYWzrKiNRkesOon69Rb3e8kWM29lz2G+t+uboPpPoexY1V/I6rqd7DSzQvLXtK61Ffw+dr9nLor8
DXXr+D3nn+zfckWIP+3u7uZ6etJ/Vm9YJfYe/D6nQqb/jH9NXudrY7asNbUx94h1fqxdr0X8Xlo1
Wb2WnHnLO4zaT6H6WMXy19btscczn1Lh35vTp8jvWIbf89H07NXSyO+Jlcqvz/zqM3896jje35t1
YdV+sv+ePWK/fq+qkOoehzq/19fGvI9gruKraqFN/0yuqNm1F+0ZmbN+7adQvW1pPVfXbf4o+dse
guf38fs931tQFy6VdlPkHFPWyV8lvLN7k76JkkC4ePHmW4k5oWhpARv4vaJCag5Z4/dFamNOK1L1
gTbvoZpn6XzbW7ixaaz4Ln6vPlZZL05N3c7r+1vGEAH4fSR+r/hT6VWTv36T1xOxH75xtEGZUso9
3cTvbeP3Or+X22Ce32tqo5vfs61ZScfFwuOrudMt2WXD/vcu/TPVxyrze8058ju/8/tS/F4TVU03
Tqf1TV7MKqX26luX3zcsfq8+35bzZ9KPoHou46TdrS/iop9PRclyxxK/8zvW7Pd5vaLpP89OZ22f
PeqCP7vXuCe6td9Lr/FGfp/TaHTpf+/q95LaaDs/cuL1+qnqTXrjayP4+k+h8lgd+9/5nd/5vWYy
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
NRpJA0xVBAAAAABJRU5ErkJggg==
------=_Part_1242_234203149.1547860338011--

.


Author: joel.g.hemphill@gmail.com
Date: Fri, 18 Jan 2019 17:19:17 -0800 (PST)
Raw View
------=_Part_1174_980906168.1547860757552
Content-Type: multipart/alternative;
 boundary="----=_Part_1175_950262710.1547860757553"

------=_Part_1175_950262710.1547860757553
Content-Type: text/plain; charset="UTF-8"

I think the idea of un-abbreviating pow would be a nice design shift,
though I am skeptical due to the amount of code which would be made
'legacy' by such a change. As for the operators... Those would need to be
introduced at the core-language level, and I don't think that it would be
an appropriate proposal here. As a side note here; I DO think it would be
an interesting shift in the core language to support user-defined
operators. It would be very difficult to define a consistent methodology,
but it would significantly improve the general readability of a good number
of object-interactions. For instance: operator::@(MyPointClass c)". Like I
said though, this really isn't the place for such ideas, as those would
need to happen at the lower-levels of C++.

On Friday, January 18, 2019 at 3:42:19 PM UTC-8, Jake Arkinstall wrote:
>
> I agree on that - but I also dislike like the unnecessary abbreviation
> "pow", so I'd propose a templated function std::power, maybe with a default
> for unsigned integral powers if T operator*(T const&, T const&) exists.
>
> Even better, an operator for it instead (e.g. ^^, as ** introduces
> ambiguities).
>

--
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/a4ed51d9-36ac-462f-aafa-06478682140a%40isocpp.org.

------=_Part_1175_950262710.1547860757553
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">I think the idea of un-abbreviating pow would be a nice de=
sign shift, though I am skeptical due to the amount of code which would be =
made &#39;legacy&#39; by such a change. As for the operators... Those would=
 need to be introduced at the core-language level, and I don&#39;t think th=
at it would be an appropriate proposal here. As a side note here; I DO thin=
k it would be an interesting shift in the core language to support user-def=
ined operators. It would be very difficult to define a consistent methodolo=
gy, but it would significantly improve the general readability of a good nu=
mber of object-interactions. For instance: operator::@(MyPointClass c)&quot=
;. Like I said though, this really isn&#39;t the place for such ideas, as t=
hose would need to happen at the lower-levels of C++.<br><br>On Friday, Jan=
uary 18, 2019 at 3:42:19 PM UTC-8, Jake Arkinstall wrote:<blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;">I agree on that - but I also dislike like the u=
nnecessary abbreviation &quot;pow&quot;, so I&#39;d propose a templated fun=
ction std::power, maybe with a default for unsigned integral powers if T op=
erator*(T const&amp;, T const&amp;) exists.<p>Even better, an operator for =
it instead (e.g. ^^, as ** introduces ambiguities).</p></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/a4ed51d9-36ac-462f-aafa-06478682140a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/a4ed51d9-36ac-462f-aafa-06478682140a=
%40isocpp.org</a>.<br />

------=_Part_1175_950262710.1547860757553--

------=_Part_1174_980906168.1547860757552--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Sat, 19 Jan 2019 01:59:07 -0500
Raw View
--0000000000009dc518057fca2a17
Content-Type: multipart/alternative; boundary="0000000000009dc516057fca2a16"

--0000000000009dc516057fca2a16
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Jan 18, 2019 at 8:12 PM <joel.g.hemphill@gmail.com> wrote:

> The case you pointed out of using the double-type of the return for
> 'pow(int, int)' would be a major concern. Perhaps a workaround would be t=
he
> requirement of an explicit template? i.e. "double x =3D std::pow(10, 20);=
"
> would use overload 7, whereas "std::pow<int, int>(10, 20)" would return
> int? Alternatively, as Jake Arkinstall suggested, a new syntax for 'pow' =
as
> 'power' might be in order, in which case, such contingencies wouldn't be =
as
> large a concern. I would also argue that the above code segment is poor
> practice, as it is relying upon the pow function to convert the two
> integers to doubles. More explicit typing would be preferred in most codi=
ng
> environments. Another solution, as is implemented with powl and powf, is =
to
> use a single-letter abbreviation to explicitly define the types used. i.e=
..
> powi.
>
> As for the graph; I mentioned in a reply to my original posting that I
> have since found an issue with the testing method I used for graphing the
> execution times for pow and powi. I have since done other tests as shown
> below [avg. of 20000 runs for powi, and 500 for pow (since the execution =
is
> longer, I decided to neglect the sample-count somewhat)]:
>
> [image: Untitled2.png]
>
> As you can see, powi does experience a gradual increase in execution
> length with the increasing exponents (since it needs to do at worst [if a=
n
> implementation were to use a simple linear approach, O(n) multiplications=
]).
>
But really O(lg n) multiplications, right?
That graph looks a lot better (flatter), but I'd still have to see the code
before I believe it. You say your data was

> gathered using "std::chrono::high_resolution_clock::now()" surrounding
for-loops executing the functions

which pointedly omits any reference to e.g. Google Benchmark
<https://github.com/google/benchmark> or ClobberMemory/DoNotOptimize. Which
suggests that your benchmark might not have been measuring anything
meaningful.

=E2=80=93Arthur

--=20
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 e=
mail 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/CADvuK0LeMK-uYS5WPMEMxKjfGAA6TFybpFJD_Yqh12wkOP4=
FcQ%40mail.gmail.com.

--0000000000009dc516057fca2a16
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr">On Fri, Jan 18, 2019 at 8:12 PM &lt;<a hr=
ef=3D"mailto:joel.g.hemphill@gmail.com">joel.g.hemphill@gmail.com</a>&gt; w=
rote:<br></div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote"=
 style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:=
solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"=
>The case you pointed out of using the double-type of the return for &#39;p=
ow(int, int)&#39; would be a major concern. Perhaps a workaround would be t=
he requirement of an explicit template? i.e. &quot;double x =3D std::pow(10=
, 20);&quot; would use overload 7, whereas &quot;std::pow&lt;int, int&gt;(1=
0, 20)&quot; would return int? Alternatively, as Jake Arkinstall suggested,=
 a new syntax for &#39;pow&#39; as &#39;power&#39; might be in order, in wh=
ich case, such contingencies wouldn&#39;t be as large a concern. I would al=
so argue that the above code segment is poor practice, as it is relying upo=
n the pow function to convert the two integers to doubles. More explicit ty=
ping would be preferred in most coding environments. Another solution, as i=
s implemented with powl and powf, is to use a single-letter abbreviation to=
 explicitly define the types used. i.e. powi.<div><br></div><div>As for the=
 graph; I mentioned in a reply to my original posting that I have since fou=
nd an issue with the testing method I used for graphing the execution times=
 for pow and powi. I have since done other tests as shown below [avg. of 20=
000 runs for powi, and 500 for pow (since the execution is longer, I decide=
d to neglect the sample-count somewhat)]:</div><div><br></div><p class=3D"g=
mail-m_1293241612643520167separator" style=3D"text-align:left;clear:both"><=
img src=3D"cid:48451991-147f-4022-b5a2-fd68fb1a3cbe" alt=3D"Untitled2.png" =
width=3D"320" height=3D"183" style=3D"margin-left: 1em; margin-right: 1em;"=
></p><p class=3D"gmail-m_1293241612643520167separator" style=3D"text-align:=
left;clear:both">As you can see, powi does experience a gradual increase in=
 execution length with the increasing exponents (since it needs to do at wo=
rst [if an implementation were to use a simple linear approach, O(n) multip=
lications]).<br></p></div></blockquote><div>But really O(lg n) multiplicati=
ons, right?</div><div>That graph looks a lot better (flatter), but I&#39;d =
still have to see the code before I believe it. You say your data was</div>=
<div><br></div><div>&gt; gathered using &quot;std::chrono::high_resolution_=
clock::now()&quot; surrounding for-loops executing the functions</div><div>=
<br></div><div>which pointedly omits any reference to e.g. <a href=3D"https=
://github.com/google/benchmark">Google Benchmark</a> or ClobberMemory/DoNot=
Optimize. Which suggests that your benchmark might not have been measuring =
anything meaningful.</div><div><br></div><div>=E2=80=93Arthur</div></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">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/CADvuK0LeMK-uYS5WPMEMxKjfGAA6TFybpFJD=
_Yqh12wkOP4FcQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0LeMK-uYS5W=
PMEMxKjfGAA6TFybpFJD_Yqh12wkOP4FcQ%40mail.gmail.com</a>.<br />

--0000000000009dc516057fca2a16--
--0000000000009dc518057fca2a17
Content-Type: image/png; name="Untitled2.png"
Content-Disposition: inline; filename="Untitled2.png"
Content-Transfer-Encoding: base64
Content-ID: <48451991-147f-4022-b5a2-fd68fb1a3cbe>
X-Attachment-Id: 48451991-147f-4022-b5a2-fd68fb1a3cbe

iVBORw0KGgoAAAANSUhEUgAAAfUAAAEfCAIAAADX9ciiAAAYyklEQVR42u3dXY8kV3nAcX8UfwWu
fJcrbgJSRHJBGAVF5gKhCHEDGgSy0MoRG0HA0eBIK4LIIuMQRzAQIDFaI8cKlm2W8Rteg9fGlrN4
gWSJvYbFXu+yMZtnpnqqq+utq6uqX6r691fJ7u2pl1Onu/7nqXNO13PLhQsXXgAAjItw+y3xv5sA
gHERbud3AOB3AAC/AwD4HQDA7wAAfgcAfgcA8DsAgN8BAPwOAOB3AAC/AwC/AwD4HQDA78CquLi/
u7Ozu39RTYDf+X143jm7tzPLZtmsULydnb2z4/L70TFytV9y2jOnf/j31X5QM6XU5PE7Nsc7NTrI
/SkRyyoV2sDvqyvOyr2Z+yDjn/nDl9bAasuZuD1ThsM3Oh1+9e0T+J3fV2/U7fZ7g9Nbu9+Pvms9
fwT8zu9o7vfjgGp6X3/8x9n76qIqClda2a5Lti60MHkP5bWQ7XIornZ8lEbRa/lfZs6kukKqylNa
UYWzrKiNRkesOon69Rb3e8kWM29lz2G+t+uboPpPoexY1V/I6rqd7DSzQvLXtK61Ffw+dr9nLor8
DXXr+D3nn+zfckWIP+3u7uZ6etJ/Vm9YJfYe/D6nQqb/jH9NXudrY7asNbUx94h1fqxdr0X8Xlo1
Wb2WnHnLO4zaT6H6WMXy19btscczn1Lh35vTp8jvWIbf89H07NXSyO+Jlcqvz/zqM3896jje35t1
YdV+sv+ePWK/fq+qkOoehzq/19fGvI9gruKraqFN/0yuqNm1F+0ZmbN+7adQvW1pPVfXbf4o+dse
guf38fs931tQFy6VdlPkHFPWyV8lvLN7k76JkkC4ePHmW4k5oWhpARv4vaJCag5Z4/dFamNOK1L1
gTbvoZpn6XzbW7ixaaz4Ln6vPlZZL05N3c7r+1vGEAH4fSR+r/hT6VWTv36T1xOxH75xtEGZUso9
3cTvbeP3Or+X22Ce32tqo5vfs61ZScfFwuOrudMt2WXD/vcu/TPVxyrze8058ju/8/tS/F4TVU03
Tqf1TV7MKqX26luX3zcsfq8+35bzZ9KPoHou46TdrS/iop9PRclyxxK/8zvW7Pd5vaLpP89OZ22f
PeqCP7vXuCe6td9Lr/FGfp/TaHTpf+/q95LaaDs/cuL1+qnqTXrjayP4+k+h8lgd+9/5nd/5vWYy
Y8MrPDcJpGROyOHme3t7s329u/mrrWT6SuWwZGO5FNy709Tv+fJMi1M7bl1fGw2a2NK+9bymyiaw
tpr/fvRR7O3t5pva3I1VxdkVu41yUXpJjeU+hepjVc07rapbfud3fq8LHqd94PPmv5df3JUzPPJd
xpU3/dn9zLk1Xyh4TM+q2OffrEJ2aiqqfJZ/aW008XvJicwOIFcMRZb6fe5jJcqHN8sehzDH7/Xl
nPcplJew5AtZXbf8zu/AhjfIDAR+B8ZGriMG4HdgNMG7X9CD3wEA/D7wgG69N+yZJ3ocv+wYYcY5
6YEA+H0M1Pyuv6ELcw+kam3TdCZC8x2lv0eaffBUJ8PzO8DvI4m/M9OGj3+R31yPWRdOGooF3Zru
YXrcBQSbPC2m2E403L4quxC/A/w+guA9+2zG1K97TR1dotIFZ1ike8gUpbmgp2u28nvpquJ3gN9H
Er/PPBh30fi5uwu7+b2igVmgTMW1+R3Dv5wb37v2N3C1cFnXdae8Tf3vJc9zzQb1Kzx+9gfmJuEB
S/R7DwNX3UbOug/dtR843PL5Mx0D2B5j+oGWfwAhzNKCOHc/q/3kWg4ddRy4mlm71Z1/x6G7TgOH
/M7vSw8ibpp9hJ4vktUNXN1cUs/q4u1Ti4HDbRpf7RgFdJ1/st4CdNzc7COzj9Z78bYfOuo8cLUE
v7cObBb86m9R/N5xAkn3+SfrLUC3zc0+Mvtoq28g1jly1mHgcNt+39RlAkn3+SfrLUCXzc0+6n32
kRkgfUdrK+1bG0bPqucTYOlBxBhiqHUaaqtngPA7vwMbfuNoBsjMjhZpnoyctd98W/3eMfTsHrmu
twCD3nyA5TcDpOfBGyNn4neG4veN2dwMkJvtbx+MnLXdnN8ZSu2tvPwrZ7gzQNAF/e8AwO8jCdw7
/S6l4+ZrL8CgN1d7ak/t8XvdLWLb+u24+doLMOjN1Z7aU3vid82/4MnmTl/tbWv/zGQyadvK7rj5
2gsw6M3VntpTe/wOAOB3AOD3kZCZCNzmEa8dN197AQa9udpTe2rP8wlq8Mscv2tSezbflvJv4fx3
XxO1p/ZsvhXl39L5M23vkjpuvvYCDHpztaf21J7+GQAAvwMAvwMA+B0AMFK/H03WzIz3TkcHMk+f
rhonqPkTAGCNfg+Z7+6fzWQPmEnaciTt4/9PVr6Ys3vFn/rj9ttv77LCejdXPMVTPMVbY/w+mx1m
xu+Hr8r/WLNd2nLs7u/vHcf2x3F+JiVM08lDt9xyy80OK6x3c8VTPMVTvI3xe6bLJZ/EfVG/70xj
+8nLNN5fJCOlb4niKZ7i8Xs/fk/EfPjfoze7xO+F5JGp15PwvVGXzi0AMEA2zu9FZS/H79lbBf0z
iqd4iid+X4nfU99Oxkxbjq828fvNJl01viWKp3iKx+8tmHlUQtpHnpsfma6UmVkzeZn/UzO/zzw/
c15HvG+J4ime4vH7OLn11lu7rLDezRVP8RRP8fgdALYXfgcAfgcA8DsAgN8BAPwOAOB3AOB3fgcA
fgcA8DsAYGR+z+fnK3/ejPx8ADAovxfy8808QTL3xnry8wEAv3eI4Kuf4772/HwAwO99+L3wwOC1
5+cDAH7vye+z+T3Wnp8PAPi9Z79vSH6+ixcvvgAAgyLEtXl+nw6ZHr9ad34+ABC/t6CYn69kyuN6
8/PV8Mqlq6e+/fLHTj37b4/+t+8HAH4fPK9duf7NH/zyA5958p0ffSRdHnn2VTUDgN8HyfUbbz9w
cOmTX/ppVuvp8t4TB+F93xIA/D4kDs5f/tx9L77r44/lnB7vnLz3hfd/+onknx879axvCYC188iz
ry6qoy31ewTmxWg96i5i+d9dvRErPHfhSqr+b/7gl9tTM/c9eDHq4dS3X17SjUvyHV3e/oGxyj3R
Eb/PJ6v1D3zmyZDa/7x2LbfOPWd+nkb0L/3ijdHXyY9f+k12+OE9d5yNGrh+4+0eD5FW6ZL2D4y1
syENN/m9kd8jhN/bf6le3BFppm3AiE0UofTJe1+oGoHoax5R1PZS9x/EvVdy/6HlwGgIR0UwlFwv
7//0E/zeGxHUpzUbelrBEdPZmZ+778UIqFsU+Mv3X4jNw9fhzeJNSZEQYnqOSVgdBUiHH9LmrctU
olDtidPns/1g/e4/OfEodvZEPnTX01GZvsMYjYLiqmlyRfP7Ajz01K9XMF2ydHZm8omGr5t4KspZ
Ogso9hktU5S8GM/mOmRiiVYh6RaPlaM8WV0mXn7uwpUWMXV6G5QcInbe4/4juom2sPTmI25pHzi4
5DuM4co9jYTiYmnRS8zv80n10ft0yfrZmdklotGIx4tHTwL20uHi4vKRLzwT0Xo4tNghE6Iv3i6E
mmPnuSlGEYk3DyJizSh5um2E2D3u/+D85WzLkTYScZRco5WMmQ+CpH8puQO758zPY4nTjI/Gvci2
EV/a9NqJa6RF6MPvTS3c+3TJ+tmZEYxH0J0Lb1P9xV+jSFUBe7wZfwpNhM2bSD+OEivX31sUA+Qm
/T+hpGw/TNVRSvdfL7hoFIv3OrF+eg3Ei+yh43W7y2OVxAk2+chiHbOPtsE56ZchnBCXQLv98Hsj
Gk6XjKsu3Bq2yvUvN1myszOzvS5VI5/FgcqIhXPCjW/JI8++Gk1F0Ya5Dpkm3SAL9f9EjaXtU5N+
kqr9lzZIuRYxClBsaaImc1VX34yt92KOz27RL0x8zbZhWtd2yj17LXTpY+T3ptRMl4zWNa7PbEdE
86VqdmZOVREsVwV3ScDepKskdhLKS/xY2iEzl9ik5jTT/p/sdK6Foo/6/RebtPhQ6vte4trI3iRF
I7ppkW9uFCRKG3UYb0alJbcv8ZFFsWs+/dbBHTaT7O1sxx/frCz/av69IeZfzU6XDMVH1cfVVexj
aeimubMzSx0dF3xyc1AasK/sbqZh/0+7QaFXLl2tF1zUQIi74QzI2Fu2zYgitRNienOW3Gn10sGa
65iKc5zbzx6Vn52MlA7PjH4kOZ382m5q2VDIjh7Fl7/j3laTfzV59zC3XuZpkcPLv5qdq1QzEBra
3ZKQqr7/p8V0ruWVMzfoGg1zXDyhiblDr1U3Zx1PLZqK7Kh4fK8WEnQcPao9F1vEDiPmWNJgcuw2
bd5WPPxbnPy60NSyIXYSJP1v3Xe4kue/3zx+iO/x832Hm381O10ye13FhxF/2uZRr1z/Twh002oj
TFTaPIcpIiLO6j6sMffmrPXPsqJaciMNcfR2dRVbRbFzs6fiHEP9fYkvbhcW6nuMW5Cwf1KfsUSj
FbXapB0tpWby69ypZdnWPQoQsX/2uVJVS6yQNGBJ+eOijm2XPc6RxEnZM40K7GXPq/F7/GOSIrWr
3zcg/2oSCcaVH1dpWMDEtQERFihOqWy+hEpSNbe7AuMyzrYxoebut3phhxBc0Vyh2ua9WMWmOk6w
Xd/j3HkEuda0qjEunfwaZzR3allW6FUzC9ot/bZeaT0Xx1T6+vX1Kvw+fdlH/N5L/lX5+baZ/3j0
p/d895mTX3nyrz7/o7mX9J/d8din/uHJr93/zOM/Pp9sm7z/x7uP/uS55xc9dOxtOnnpK08+fe58
j+f19QfOffCz+TP6k08+duc/Pvnwj56r2fCHT5z/1wef/buvPfWxux//8xM/rKqK2//m7N/e+1Ss
+e//+ZNk/Vg+ceqJqMbicRsucbg4aOwn9pnURnw0f/HX+TLEUc48/JNsmeMTiTd7b346LlEVsSRn
FEucS5xXemrp1y+qMSqzdA9RkzXfig3MzzeTWCntWVlv/lUg2wkQgVjyWIh0EkvNzVkaKS86yhfr
p2H78ubjx55Lf1qRDeejJBE5JqdcH6THyUa8HHFxwxA1GRtPwueIcJOnZcTSLo6umvyaHRWomVqW
PffYT6w5t9rjWEn5kwg9HW/oqwGo+iliMm7Xe0fQqvrfc36WfxWDJe0nzf0ct/mGcSUvu5CJ+NpZ
9T13nD1x+nxsvoy+x9hntBaJ92ualiaTX3NeTqeWLST0RQvfY+uV9Ck1fE7U5vi9JP9qwc+bm38V
mNuHnk6TXaiXPO01XuWYTVU4nxN6SCpsFQH+in/oW9T9QpNfN40mDUAyHaP0kVCD8DswZiKoTHXZ
PPI6OH+5RauwpHD+Q3c9nUxwDBN51MGI4XdgYdIO2eazJNPOme4/WgH4HVgWcfe90CzJuBNPQ34T
asHvwOby0i/eSCd4NOlFTX8W95EvPKP2wO/ARrPQLMn0SZYb+wxL8DuACc1nSWY7ZzbkgTzgdwCV
NJ8l+cDBJZ0z4HdgMDSfJZk+sqb1I8kAfgdWSpNZktlmwExz8DswDJrMkkw7Z/rK3AvwO7B0msyS
bPFLKGDD/Z7Pz1d8pMwQ8/MBOepnSb525XraACwprRKwYr8X8vNd3N/LPTZymPn5gBz1syQjZk8z
NqgrjCZ+r3g+8LGyh5ufD8hSP0sy7ZwZffJr8Pv0zUHn5wNSamZJxj91zmB7/D6T0mm9+fmAvqga
QU1n15y81/wFjN3v2d70tefnk38VffH3//L0ZAbk3Y9n309Tkn7t/mfUEnphA/Ov3pxJzjR9Q34+
jIHSWZLZzpmBpiKC+L2UQn6+mTcmzpafD6OhOEvynjM/1zmD8fbPAFtDcZZkmgnv4Pxl9QN+B4ZK
bpbkK5eupnmrdc6A34EBk5slmXbORFyvcsDvwLDJzpJMu+N1zoDfgcGTznZP5f7eEweqBfwODJ50
lmS67O2/pFrA78AYSCP35nm3AX4HBkA6S1LnDPgdGBXpLMlYvnz/BRUCfgdGQnaW5HMXrqgQ8Dsw
HiJsr0/HCvA7AGBD/Z7Pv1pMqSr/KgAMzu8l+Vfzj/yVfxUAhhm/zzzAt5iyQ/5VAOB3+VcBYDvi
917yr8rPB0B+vgH5Pd1I/wwArCb/am/jq/KvAsA6/V7Iv1qWUlX+VQAYZvwOAOB3AAC/AwD4HQD4
XUUAAL8DAPgdAMDvAAB+BwDwOwDwOwCA3xdj+kiazANk5OcDgIH7ffowsOOHQ8rPBwCj8/vhK/n5
AGAUfs90uSTelZ8PAEbi90TMh/89Tu+x3vx8AMDv/QTvm5afT/5VAPKv9tQ5c+zbyZip/HwAMIr+
mUzuvIyV5ecDgKH7HQDA7wAAfgcA8DsA8DsAgN8BAPwOAOB3AAC/AwD4HQD4HQDA7wCArfV72fPE
5F8FgIH7PfuE4Nwb8q8CwHD9XsjTIf8qAIzC7xnv7hw/q13+VQAYhd9n8zetPf+q/HwA5Ofr2e8b
kn8VAMTvfTAdMj1+Jf8qAIzB72VTHuVfBYAx+B0AwO8AAH4HAPA7APA7AIDfAQD8DgDgdwAAvwMA
+B0A+B0AwO9NOHpATPbZkPLzAcAY/J7kXso8TUx+PgAYgd+ThzweP/9Rfj4AGIffw8STFHpd/S4/
HwBsjt+nmu4jfu8lPx8A8Hsvet+Z4ahnZb35+eRfBSD/aq+c7Ti+Kj8fAGy43+XnA4BR+R0AwO8A
AH4HAPA7APA7AIDfAQD8DgDgdwAAvwMA+B0A+B0AwO8AgC3ze/GRYfKvAsDw/X5xfy/3WGD5VwFg
HPF7Jo4/VLb8qwAwLr8fC1v+VQAYk9+nul57/lX5+QDIz9d318zN5fk93Uj/DACsyO+Z5HvTN+Rf
BYCh+z0z7pl2oMi/CgAjiN8BYKv5w43rVx/64pXTH4zlja9/Il7H8vufPfr7lx//v//9r+LK8X4s
186dSdaMTZJt+R0ANoi3Dr7x+mff+dqn3lG//PZLf3n5ztvq1+F3AJsXwL515erDpyMC/d0/f/Qw
dH358Xhn9Gd9/bmHfvOFP51r9uYLvwPYIN5+/Zdvfu/zl0/+UdFWr9/17rHq/sYr56Ixy55s1MBb
j/3TYcfLzx7N9rpE2F6slqQ3Jupt0pNz1F1z41fP8zuAEsle/f7dh9b46ofDFxFXFrt9+3fcr55/
41sneoxeOy55bz58OvFmVE6/VR2N1ozZ77wtKn/1DRi/AyPn2rkz4fQq5R3K7rsnk7jyDzeu93XQ
CFFz0WtyrCjMtae+E3ot/nUTlgilkwagfqlqHt7+3avxp9w+o4WL99fy0fM7MOaAvcmwXkmEexTj
x/LWwTcmCmtsqNB3scf5ja9/4sYr50oD/E3W/aJLbnQ0qnHRHhV+B7aLZLZcRIvpJLmkzzqWkGPi
3+y9f1XAHm8ehs9HU+5iJ4uqv0mEm9tn+C5uDvrt/ejY5iXVFfcrSQUmxf7tqff1fB9w6n1xlLWf
L79jzAHs5GI++EZyMYcWUxN1mYMcL0KsC3WnRvwb+4lb9SaCzgp90dkXRWvHOxHIl0o2Djo50LdO
FEf5OvV0x0Ef+uLIhkybNA9xAxQf9IYUeEv9Hp/BCG4GLUvqgZ07Bzm7clzqNQOVhzMlvn/3QuFh
j9PpkoB9oUvjxq+eTxQW0j9UWDIke/qDzUt1KLho/Prryge/LwaLWXqfmPHm9z4fNo9vV+g+pB9u
bd5ONGlIDkdBj3vD6/1bE7CD31fBevPz8dE2LKG8xH0hu+wk4snSdg5ycnveojcjovgoSdIdNDdA
ToVeOiwJbLDf5efD8PnDW1euPfWdaB5Kf7mThtJvfOvEtXNn1jVDDvy+ar8vIz+f5HxYIxGVR5if
jOtcvvO2K1/9cH2/PMDvjfPzeeI7AAw9fq94/vsCyfkAgN8H5Pd0i0b9M/KvApB/dWmCX1p+Pl01
AHBzjfMj+83Pty85HwBsiN8BAPwOAOB3AAC/AwC/AwD4HQDA7wAAfgcA8DsA8Du/AwC/AwD4HQDA
7wAAfgcA8DsA8LuKwKYxmwbgYvYJ/0fv7u5u0JP+q3MWAPwO5IU5TeAy9XhN3q71MU05dviyUaEK
qScBfscW+r3Cixvj95KiZss2fZ0G+flcY5mbk+PNDlOV7e8dv3e8gjYB/I6RGL5otA30e1koXub3
mfJmN8q2D+nrw7NP0xBPXmbuEwB+x3I5OH/5/Z9+4p0ffaSvJfb2wMGlguWn/mzt99//7NHX73r3
a596Ry9L7OraU99ZzO8zDVbleUxbgwap5AF+x7LoV+7J8q6PP1YTILeWXY9yT5bLd95WIvPa/pmb
076Y3V1+B79jk7nvwYu9+31v/6Wbs+OUWau1lt3Vh0/36/c3v3sye48x7Tc/fDUt5pHOS/S/s1PW
PzPtgeF38DtGS2YwMuO0WdmVrbEWpgOkhdLt7SdN1cwEz3TENNtzszMrfX4HvwMA+B0A+B0AwO8A
AH4HAPA7AIDfAQD8DgD8DgDgdwAAvwMA+B0AwO8AAH4HAH4HAPA7AGCD/P7iiy++AAAYF+H2/wfV
NRpJA0xVBAAAAABJRU5ErkJggg==
--0000000000009dc518057fca2a17--

.


Author: joel.g.hemphill@gmail.com
Date: Tue, 22 Jan 2019 09:50:59 -0800 (PST)
Raw View
------=_Part_2623_87763843.1548179459654
Content-Type: multipart/alternative;
 boundary="----=_Part_2624_565982781.1548179459655"

------=_Part_2624_565982781.1548179459655
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

I wasn't aware of Google Benchmark before now. I will attempt to=20
familiarize myself with it, so that I can get more accurate timings. In the=
=20
meanwhile, below is my implementation of what I hope to propose. If the=20
results from Google Benchmark don't align with what I have presented, I=20
sincerely apologize for the misinformation.

__declspec(naked) __int32 __fastcall powi(__int32 base, __int32 exponent) {
  __asm {
  // No Stack Usage
  /*------- Prolog ---------*/
  //push ebp
  //mov ebp, esp
  //sub esp, __LOCAL_SIZE
  /*------------------------*/


  // Entry Register Values
  //------------------------
  // EAX =3D UNDEFINED
  // EBX =3D UNDEFINED
  // ECX =3D base
  // EDX =3D exponent
  // ESI =3D UNDEFINED
  // EDI =3D UNDEFINED
  //------------------------


  // eax =3D 0
  xor eax, eax;


  // if(exponent =3D=3D 0) { return 1; }
  test edx, edx;
  jnz if_zero_exp;
  inc eax; // Set eax to 1
  jmp powi_exit;
if_zero_exp:
=20
  // if(base =3D=3D 0) { return 0; }
  test ecx, ecx;
  jz powi_exit;


  // ebx =3D base
  // ecx =3D exponent
  mov ebx, ecx;
  mov ecx, edx;


=20
  // ecx =3D abs(exponent)
  // edx =3D sign(exponent)
  sar edx, 31;
  xor ecx, edx;
  sub ecx, edx;


  // Create a copy of the base, and move it to a temporary register
  mov esi, ebx;
=20
  /* find abs(base) */
  mov eax, ebx; // Copy the base to the accumulator
  sar eax, 31;  // Fill with sign bit
  xor ebx, eax; // Not the value, if sign bit is set
  sub ebx, eax; // Subtract the sign bit, giving the absolute value
=20
  // Return the copy to the accumulator
  mov eax, esi;


  // EAX =3D base
  // EBX =3D abs(base)
  // ECX =3D abs(exponent)
  // EDX =3D sign(exponent)


  // if exponent is negative
  /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
  test edx, edx;
  jz if_exp_sign_eq_0;


  // if abs(base) =3D=3D 1
  /*----------------------------*/
  cmp ebx, 1;
  jg if_base_gt_1;
  // ecx =3D exponent & 1
  and ecx, ebx;
=20
  // eax =3D exponent & 1 ? (base < 0 ? -1 : 1) : 0
  imul ecx;


  // ecx =3D exponent & 1 ? 0 : 1
  xor ecx, ebx;


  // eax =3D exponent & 1 ? (base < 0 ? -1 : 1) : 1
  add eax, ecx;


  // Return exponent & 1 ? (base < 0 ? -1 : 1) : 1
  jmp powi_exit;
if_base_gt_1:
  /*----------------------------*/
=20
  // Return 0
  xor eax, eax;
  jmp powi_exit;


if_exp_sign_eq_0:
  /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D*/


  /* if exponent =3D=3D 1, return base */
  dec ecx;
  jz powi_exit;


  // If base =3D=3D 2
  //cmp ebx, 2;
  //jne if_base_2;
  // sal eax, cl;
  // ret;
  //if_base_2:


  /* Exponentiate the multiplication */
  mov ebx, eax;
multiply:
  shr ecx, 1;    // Shift and check the first bit of the loop counter
  jnc noMulByEBX
  imul ebx;  // Multiply by the current multiplier
noMulByEBX:
  imul ebx, ebx; // Square the multiplier
  test ecx, ecx; // Test if this was the last itteration
  jnz multiply;


  /* Exit the function, returning the value of eax */
powi_exit :
  // No stack usage
  /*------- Epilog ---------*/
  //mov esp, ebp;
  //pop ebp;
  /*------------------------*/
  ret;
  }
}


On Friday, January 18, 2019 at 10:59:21 PM UTC-8, Arthur O'Dwyer wrote:
>
> On Fri, Jan 18, 2019 at 8:12 PM <joel.g....@gmail.com <javascript:>>=20
> wrote:
>
>> The case you pointed out of using the double-type of the return for=20
>> 'pow(int, int)' would be a major concern. Perhaps a workaround would be =
the=20
>> requirement of an explicit template? i.e. "double x =3D std::pow(10, 20)=
;"=20
>> would use overload 7, whereas "std::pow<int, int>(10, 20)" would return=
=20
>> int? Alternatively, as Jake Arkinstall suggested, a new syntax for 'pow'=
 as=20
>> 'power' might be in order, in which case, such contingencies wouldn't be=
 as=20
>> large a concern. I would also argue that the above code segment is poor=
=20
>> practice, as it is relying upon the pow function to convert the two=20
>> integers to doubles. More explicit typing would be preferred in most cod=
ing=20
>> environments. Another solution, as is implemented with powl and powf, is=
 to=20
>> use a single-letter abbreviation to explicitly define the types used. i.=
e.=20
>> powi.
>>
>> As for the graph; I mentioned in a reply to my original posting that I=
=20
>> have since found an issue with the testing method I used for graphing th=
e=20
>> execution times for pow and powi. I have since done other tests as shown=
=20
>> below [avg. of 20000 runs for powi, and 500 for pow (since the execution=
 is=20
>> longer, I decided to neglect the sample-count somewhat)]:
>>
>> [image: Untitled2.png]
>>
>> As you can see, powi does experience a gradual increase in execution=20
>> length with the increasing exponents (since it needs to do at worst [if =
an=20
>> implementation were to use a simple linear approach, O(n) multiplication=
s]).
>>
> But really O(lg n) multiplications, right?
> That graph looks a lot better (flatter), but I'd still have to see the=20
> code before I believe it. You say your data was
>
> > gathered using "std::chrono::high_resolution_clock::now()" surrounding=
=20
> for-loops executing the functions
>
> which pointedly omits any reference to e.g. Google Benchmark=20
> <https://github.com/google/benchmark> or ClobberMemory/DoNotOptimize.=20
> Which suggests that your benchmark might not have been measuring anything=
=20
> meaningful.
>
> =E2=80=93Arthur
>

--=20
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 e=
mail 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/7801bc16-e087-43ed-ab4f-5b5f907c125f%40isocpp.or=
g.

------=_Part_2624_565982781.1548179459655
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">I wasn&#39;t aware of Google Benchmark before now. I will =
attempt to familiarize myself with it, so that I can get more accurate timi=
ngs. In the meanwhile, below is my implementation of what I hope to propose=
.. If the results from Google Benchmark don&#39;t align with what I have pre=
sented, I sincerely apologize for the misinformation.<div><br></div><div><d=
iv class=3D"prettyprint" style=3D"background-color: rgb(250, 250, 250); bor=
der-color: rgb(187, 187, 187); border-style: solid; border-width: 1px; over=
flow-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"subpretty=
print"><span style=3D"color: #000;" class=3D"styled-by-prettify">__declspec=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify">naked</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">)</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> __int32 __fastcall powi</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify">__int32 </span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">base</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"> __int32 exponent</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">)</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"><br>=C2=A0 __asm </span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">{</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by=
-prettify">// No Stack Usage</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"s=
tyled-by-prettify">/*------- Prolog ---------*/</span><span style=3D"color:=
 #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color=
: #800;" class=3D"styled-by-prettify">//push ebp</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"colo=
r: #800;" class=3D"styled-by-prettify">//mov ebp, esp</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D=
"color: #800;" class=3D"styled-by-prettify">//sub esp, __LOCAL_SIZE</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span>=
<span style=3D"color: #800;" class=3D"styled-by-prettify">/*---------------=
---------*/</span><span style=3D"color: #000;" class=3D"styled-by-prettify"=
><br><br><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-=
prettify">// Entry Register Values</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" clas=
s=3D"styled-by-prettify">//------------------------</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"c=
olor: #800;" class=3D"styled-by-prettify">// EAX =3D UNDEFINED</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span=
 style=3D"color: #800;" class=3D"styled-by-prettify">// EBX =3D UNDEFINED</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 <=
/span><span style=3D"color: #800;" class=3D"styled-by-prettify">// ECX =3D =
base</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// =
EDX =3D exponent</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-pre=
ttify">// ESI =3D UNDEFINED</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"st=
yled-by-prettify">// EDI =3D UNDEFINED</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" =
class=3D"styled-by-prettify">//------------------------</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br><br><br>=C2=A0 </span><s=
pan style=3D"color: #800;" class=3D"styled-by-prettify">// eax =3D 0</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 xor ea=
x</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"> eax</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br><br><br>=C2=A0 </span><span s=
tyle=3D"color: #800;" class=3D"styled-by-prettify">// if(exponent =3D=3D 0)=
 { return 1; }</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"><br>=C2=A0 test edx</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> edx</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =
jnz if_zero_exp</span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 inc eax</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </sp=
an><span style=3D"color: #800;" class=3D"styled-by-prettify">// Set eax to =
1</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=
=A0 jmp powi_exit</span><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r>if_zero_exp</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">:</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0<br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-pre=
ttify">// if(base =3D=3D 0) { return 0; }</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"><br>=C2=A0 test ecx</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"> ecx</span><span style=3D"color: #660;" clas=
s=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"><br>=C2=A0 jz powi_exit</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color: #800;" =
class=3D"styled-by-prettify">// ebx =3D base</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #=
800;" class=3D"styled-by-prettify">// ecx =3D exponent</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 mov ebx</span><span =
style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> ecx</span><span style=3D"color:=
 #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"><br>=C2=A0 mov ecx</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> edx</span><span style=3D"color: #660;" class=3D=
"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"><br><br><br>=C2=A0<br>=C2=A0 </span><span style=3D"color: #800;=
" class=3D"styled-by-prettify">// ecx =3D abs(exponent)</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span styl=
e=3D"color: #800;" class=3D"styled-by-prettify">// edx =3D sign(exponent)</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 s=
ar edx</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span=
 style=3D"color: #066;" class=3D"styled-by-prettify">31</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0 xor ecx</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"> edx</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #008;" clas=
s=3D"styled-by-prettify">sub</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"> ecx</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> edx</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br><br>=
=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// =
Create a copy of the base, and move it to a temporary register</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 mov esi</spa=
n><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span s=
tyle=3D"color: #000;" class=3D"styled-by-prettify"> ebx</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0<br>=C2=A0 </span><span sty=
le=3D"color: #800;" class=3D"styled-by-prettify">/* find abs(base) */</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 mov e=
ax</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> ebx</span><span =
style=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #8=
00;" class=3D"styled-by-prettify">// Copy the base to the accumulator</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 sar e=
ax</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span sty=
le=3D"color: #066;" class=3D"styled-by-prettify">31</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"> =C2=A0</span><span style=3D"color: #800;" =
class=3D"styled-by-prettify">// Fill with sign bit</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"><br>=C2=A0 xor ebx</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">,</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"> eax</span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #800;" class=3D"style=
d-by-prettify">// Not the value, if sign bit is set</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"c=
olor: #008;" class=3D"styled-by-prettify">sub</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify"> ebx</span><span style=3D"color: #660;" =
class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"=
styled-by-prettify"> eax</span><span style=3D"color: #660;" class=3D"styled=
-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prett=
ify"> </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// S=
ubtract the sign bit, giving the absolute value</span><span style=3D"color:=
 #000;" class=3D"styled-by-prettify"><br>=C2=A0<br>=C2=A0 </span><span styl=
e=3D"color: #800;" class=3D"styled-by-prettify">// Return the copy to the a=
ccumulator</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
<br>=C2=A0 mov eax</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
esi</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span=
><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br><br>=C2=
=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// EAX=
 =3D base</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><=
br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">=
// EBX =3D abs(base)</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by=
-prettify">// ECX =3D abs(exponent)</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" cla=
ss=3D"styled-by-prettify">// EDX =3D sign(exponent)</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br><br><br>=C2=A0 </span><span st=
yle=3D"color: #800;" class=3D"styled-by-prettify">// if exponent is negativ=
e</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=
=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">/*=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D*/</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br>=C2=A0 test edx</span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"> edx</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 jz if_exp_sign_eq_0</span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"><br><br><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styl=
ed-by-prettify">// if abs(base) =3D=3D 1</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;=
" class=3D"styled-by-prettify">/*----------------------------*/</span><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 cmp ebx</sp=
an><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"=
color: #066;" class=3D"styled-by-prettify">1</span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" clas=
s=3D"styled-by-prettify"><br>=C2=A0 jg if_base_gt_1</span><span style=3D"co=
lor: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000=
;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #80=
0;" class=3D"styled-by-prettify">// ecx =3D exponent &amp; 1</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span s=
tyle=3D"color: #008;" class=3D"styled-by-prettify">and</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> ecx</span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> ebx</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br>=C2=A0<br>=C2=A0 </span><span style=3D"color: #800;" cla=
ss=3D"styled-by-prettify">// eax =3D exponent &amp; 1 ? (base &lt; 0 ? -1 :=
 1) : 0</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br=
>=C2=A0 imul ecx</span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br=
><br><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-pret=
tify">// ecx =3D exponent &amp; 1 ? 0 : 1</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"><br>=C2=A0 xor ecx</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> ebx</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color: #800;" class=
=3D"styled-by-prettify">// eax =3D exponent &amp; 1 ? (base &lt; 0 ? -1 : 1=
) : 1</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 add eax</span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> ecx<=
/span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><sp=
an style=3D"color: #000;" class=3D"styled-by-prettify"><br><br><br>=C2=A0 <=
/span><span style=3D"color: #800;" class=3D"styled-by-prettify">// Return e=
xponent &amp; 1 ? (base &lt; 0 ? -1 : 1) : 1</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"><br>=C2=A0 jmp powi_exit</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"><br>if_base_gt_1</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">:</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"colo=
r: #800;" class=3D"styled-by-prettify">/*----------------------------*/</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0<br>=
=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// =
Return 0</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r>=C2=A0 xor eax</span><span style=3D"color: #660;" class=3D"styled-by-pret=
tify">,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> ea=
x</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><=
span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 jmp pow=
i_exit</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</s=
pan><span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br><br>i=
f_exp_sign_eq_0</span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">:</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">/*=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D*/</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color: #800;" class=
=3D"styled-by-prettify">/* if exponent =3D=3D 1, return base */</span><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 dec ecx</sp=
an><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 jz powi_exit=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">;</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"><br><br><br>=C2=A0 =
</span><span style=3D"color: #800;" class=3D"styled-by-prettify">// If base=
 =3D=3D 2</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><=
br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">=
//cmp ebx, 2;</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-pretti=
fy">//jne if_base_2;</span><span style=3D"color: #000;" class=3D"styled-by-=
prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by=
-prettify">// sal eax, cl;</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"sty=
led-by-prettify">// ret;</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"style=
d-by-prettify">//if_base_2:</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color: #800;" cla=
ss=3D"styled-by-prettify">/* Exponentiate the multiplication */</span><span=
 style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 mov ebx</sp=
an><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"> eax</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>multiply</span><span style=3D"col=
or: #660;" class=3D"styled-by-prettify">:</span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"><br>=C2=A0 shr ecx</span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">,</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"> </span><span style=3D"color: #066;" class=3D=
"styled-by-prettify">1</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> =C2=A0 =C2=A0</span><span style=3D"color: #800;" class=3D"styled-by-pre=
ttify">// Shift and check the first bit of the loop counter</span><span sty=
le=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 jnc noMulByEBX<=
br>=C2=A0 imul ebx</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> =
=C2=A0</span><span style=3D"color: #800;" class=3D"styled-by-prettify">// M=
ultiply by the current multiplier</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br>noMulByEBX</span><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">:</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"><br>=C2=A0 imul ebx</span><span style=3D"color: #660;" c=
lass=3D"styled-by-prettify">,</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"> ebx</span><span style=3D"color: #660;" class=3D"styled-=
by-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"> </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// Sq=
uare the multiplier</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"><br>=C2=A0 test ecx</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">,</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"> ecx</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </spa=
n><span style=3D"color: #800;" class=3D"styled-by-prettify">// Test if this=
 was the last itteration</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"><br>=C2=A0 jnz multiply</span><span style=3D"color: #660;" cl=
ass=3D"styled-by-prettify">;</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color: #800;" cl=
ass=3D"styled-by-prettify">/* Exit the function, returning the value of eax=
 */</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>pow=
i_exit </span><span style=3D"color: #660;" class=3D"styled-by-prettify">:</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 <=
/span><span style=3D"color: #800;" class=3D"styled-by-prettify">// No stack=
 usage</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=
=C2=A0 </span><span style=3D"color: #800;" class=3D"styled-by-prettify">/*-=
------ Epilog ---------*/</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=3D"styl=
ed-by-prettify">//mov esp, ebp;</span><span style=3D"color: #000;" class=3D=
"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" class=
=3D"styled-by-prettify">//pop ebp;</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"color: #800;" clas=
s=3D"styled-by-prettify">/*------------------------*/</span><span style=3D"=
color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 ret</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0 </span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">}</span><span style=3D"color: #000;"=
 class=3D"styled-by-prettify"><br></span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">}</span><span style=3D"color: #000;" class=3D"style=
d-by-prettify"><br></span></div></code></div><br><br>On Friday, January 18,=
 2019 at 10:59:21 PM UTC-8, Arthur O&#39;Dwyer wrote:<blockquote class=3D"g=
mail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc sol=
id;padding-left: 1ex;"><div dir=3D"ltr"><div dir=3D"ltr">On Fri, Jan 18, 20=
19 at 8:12 PM &lt;<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-=
mailto=3D"MmOfQxNrFAAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;ja=
vascript:&#39;;return true;" onclick=3D"this.href=3D&#39;javascript:&#39;;r=
eturn true;">joel.g....@gmail.com</a>&gt; wrote:<br></div><div class=3D"gma=
il_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,=
204,204);padding-left:1ex"><div dir=3D"ltr">The case you pointed out of usi=
ng the double-type of the return for &#39;pow(int, int)&#39; would be a maj=
or concern. Perhaps a workaround would be the requirement of an explicit te=
mplate? i.e. &quot;double x =3D std::pow(10, 20);&quot; would use overload =
7, whereas &quot;std::pow&lt;int, int&gt;(10, 20)&quot; would return int? A=
lternatively, as Jake Arkinstall suggested, a new syntax for &#39;pow&#39; =
as &#39;power&#39; might be in order, in which case, such contingencies wou=
ldn&#39;t be as large a concern. I would also argue that the above code seg=
ment is poor practice, as it is relying upon the pow function to convert th=
e two integers to doubles. More explicit typing would be preferred in most =
coding environments. Another solution, as is implemented with powl and powf=
, is to use a single-letter abbreviation to explicitly define the types use=
d. i.e. powi.<div><br></div><div>As for the graph; I mentioned in a reply t=
o my original posting that I have since found an issue with the testing met=
hod I used for graphing the execution times for pow and powi. I have since =
done other tests as shown below [avg. of 20000 runs for powi, and 500 for p=
ow (since the execution is longer, I decided to neglect the sample-count so=
mewhat)]:</div><div><br></div><p style=3D"text-align:left;clear:both"><img =
src=3D"https://groups.google.com/a/isocpp.org/group/std-proposals/attach/14=
6b13439f6332/Untitled2.png?part=3D0.1&amp;view=3D1&amp;authuser=3D2" alt=3D=
"Untitled2.png" width=3D"320" height=3D"183" style=3D"margin-left:1em;margi=
n-right:1em"></p><p style=3D"text-align:left;clear:both">As you can see, po=
wi does experience a gradual increase in execution length with the increasi=
ng exponents (since it needs to do at worst [if an implementation were to u=
se a simple linear approach, O(n) multiplications]).<br></p></div></blockqu=
ote><div>But really O(lg n) multiplications, right?</div><div>That graph lo=
oks a lot better (flatter), but I&#39;d still have to see the code before I=
 believe it. You say your data was</div><div><br></div><div>&gt; gathered u=
sing &quot;std::chrono::high_resolution_<wbr>clock::now()&quot; surrounding=
 for-loops executing the functions</div><div><br></div><div>which pointedly=
 omits any reference to e.g. <a href=3D"https://github.com/google/benchmark=
" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;https:=
//www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fgoogle%2Fbenchmark\x26=
sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEpR8YTYO6UOopr4cXneXU3k6mEaA&#39;;retu=
rn true;" onclick=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps=
%3A%2F%2Fgithub.com%2Fgoogle%2Fbenchmark\x26sa\x3dD\x26sntz\x3d1\x26usg\x3d=
AFQjCNEpR8YTYO6UOopr4cXneXU3k6mEaA&#39;;return true;">Google Benchmark</a> =
or ClobberMemory/DoNotOptimize. Which suggests that your benchmark might no=
t have been measuring anything meaningful.</div><div><br></div><div>=E2=80=
=93Arthur</div></div></div>
</blockquote></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">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/7801bc16-e087-43ed-ab4f-5b5f907c125f%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/7801bc16-e087-43ed-ab4f-5b5f907c125f=
%40isocpp.org</a>.<br />

------=_Part_2624_565982781.1548179459655--

------=_Part_2623_87763843.1548179459654--

.


Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Tue, 22 Jan 2019 12:52:39 -0500
Raw View
--000000000000d94f3f05800fa4c0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Why don't you just post your benchmark code? Why all the graphs and "oops
here's the new graph" and so on?

On Tue, Jan 22, 2019 at 12:51 PM <joel.g.hemphill@gmail.com> wrote:

> I wasn't aware of Google Benchmark before now. I will attempt to
> familiarize myself with it, so that I can get more accurate timings. In t=
he
> meanwhile, below is my implementation of what I hope to propose. If the
> results from Google Benchmark don't align with what I have presented, I
> sincerely apologize for the misinformation.
>
> __declspec(naked) __int32 __fastcall powi(__int32 base, __int32 exponent)
> {
>   __asm {
>   // No Stack Usage
>   /*------- Prolog ---------*/
>   //push ebp
>   //mov ebp, esp
>   //sub esp, __LOCAL_SIZE
>   /*------------------------*/
>
>
>   // Entry Register Values
>   //------------------------
>   // EAX =3D UNDEFINED
>   // EBX =3D UNDEFINED
>   // ECX =3D base
>   // EDX =3D exponent
>   // ESI =3D UNDEFINED
>   // EDI =3D UNDEFINED
>   //------------------------
>
>
>   // eax =3D 0
>   xor eax, eax;
>
>
>   // if(exponent =3D=3D 0) { return 1; }
>   test edx, edx;
>   jnz if_zero_exp;
>   inc eax; // Set eax to 1
>   jmp powi_exit;
> if_zero_exp:
>
>   // if(base =3D=3D 0) { return 0; }
>   test ecx, ecx;
>   jz powi_exit;
>
>
>   // ebx =3D base
>   // ecx =3D exponent
>   mov ebx, ecx;
>   mov ecx, edx;
>
>
>
>   // ecx =3D abs(exponent)
>   // edx =3D sign(exponent)
>   sar edx, 31;
>   xor ecx, edx;
>   sub ecx, edx;
>
>
>   // Create a copy of the base, and move it to a temporary register
>   mov esi, ebx;
>
>   /* find abs(base) */
>   mov eax, ebx; // Copy the base to the accumulator
>   sar eax, 31;  // Fill with sign bit
>   xor ebx, eax; // Not the value, if sign bit is set
>   sub ebx, eax; // Subtract the sign bit, giving the absolute value
>
>   // Return the copy to the accumulator
>   mov eax, esi;
>
>
>   // EAX =3D base
>   // EBX =3D abs(base)
>   // ECX =3D abs(exponent)
>   // EDX =3D sign(exponent)
>
>
>   // if exponent is negative
>   /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
>   test edx, edx;
>   jz if_exp_sign_eq_0;
>
>
>   // if abs(base) =3D=3D 1
>   /*----------------------------*/
>   cmp ebx, 1;
>   jg if_base_gt_1;
>   // ecx =3D exponent & 1
>   and ecx, ebx;
>
>   // eax =3D exponent & 1 ? (base < 0 ? -1 : 1) : 0
>   imul ecx;
>
>
>   // ecx =3D exponent & 1 ? 0 : 1
>   xor ecx, ebx;
>
>
>   // eax =3D exponent & 1 ? (base < 0 ? -1 : 1) : 1
>   add eax, ecx;
>
>
>   // Return exponent & 1 ? (base < 0 ? -1 : 1) : 1
>   jmp powi_exit;
> if_base_gt_1:
>   /*----------------------------*/
>
>   // Return 0
>   xor eax, eax;
>   jmp powi_exit;
>
>
> if_exp_sign_eq_0:
>   /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
>
>
>   /* if exponent =3D=3D 1, return base */
>   dec ecx;
>   jz powi_exit;
>
>
>   // If base =3D=3D 2
>   //cmp ebx, 2;
>   //jne if_base_2;
>   // sal eax, cl;
>   // ret;
>   //if_base_2:
>
>
>   /* Exponentiate the multiplication */
>   mov ebx, eax;
> multiply:
>   shr ecx, 1;    // Shift and check the first bit of the loop counter
>   jnc noMulByEBX
>   imul ebx;  // Multiply by the current multiplier
> noMulByEBX:
>   imul ebx, ebx; // Square the multiplier
>   test ecx, ecx; // Test if this was the last itteration
>   jnz multiply;
>
>
>   /* Exit the function, returning the value of eax */
> powi_exit :
>   // No stack usage
>   /*------- Epilog ---------*/
>   //mov esp, ebp;
>   //pop ebp;
>   /*------------------------*/
>   ret;
>   }
> }
>
>
> On Friday, January 18, 2019 at 10:59:21 PM UTC-8, Arthur O'Dwyer wrote:
>>
>> On Fri, Jan 18, 2019 at 8:12 PM <joel.g....@gmail.com> wrote:
>>
>>> The case you pointed out of using the double-type of the return for
>>> 'pow(int, int)' would be a major concern. Perhaps a workaround would be=
 the
>>> requirement of an explicit template? i.e. "double x =3D std::pow(10, 20=
);"
>>> would use overload 7, whereas "std::pow<int, int>(10, 20)" would return
>>> int? Alternatively, as Jake Arkinstall suggested, a new syntax for 'pow=
' as
>>> 'power' might be in order, in which case, such contingencies wouldn't b=
e as
>>> large a concern. I would also argue that the above code segment is poor
>>> practice, as it is relying upon the pow function to convert the two
>>> integers to doubles. More explicit typing would be preferred in most co=
ding
>>> environments. Another solution, as is implemented with powl and powf, i=
s to
>>> use a single-letter abbreviation to explicitly define the types used. i=
..e.
>>> powi.
>>>
>>> As for the graph; I mentioned in a reply to my original posting that I
>>> have since found an issue with the testing method I used for graphing t=
he
>>> execution times for pow and powi. I have since done other tests as show=
n
>>> below [avg. of 20000 runs for powi, and 500 for pow (since the executio=
n is
>>> longer, I decided to neglect the sample-count somewhat)]:
>>>
>>> [image: Untitled2.png]
>>>
>>> As you can see, powi does experience a gradual increase in execution
>>> length with the increasing exponents (since it needs to do at worst [if=
 an
>>> implementation were to use a simple linear approach, O(n) multiplicatio=
ns]).
>>>
>> But really O(lg n) multiplications, right?
>> That graph looks a lot better (flatter), but I'd still have to see the
>> code before I believe it. You say your data was
>>
>> > gathered using "std::chrono::high_resolution_clock::now()" surrounding
>> for-loops executing the functions
>>
>> which pointedly omits any reference to e.g. Google Benchmark
>> <https://github.com/google/benchmark> or ClobberMemory/DoNotOptimize.
>> Which suggests that your benchmark might not have been measuring anythin=
g
>> meaningful.
>>
>> =E2=80=93Arthur
>>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/a/isocpp.org/d/topic/std-proposals/y9qMRNKrS2E/=
unsubscribe
> .
> To unsubscribe from this group and all its topics, 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/7801bc16-e08=
7-43ed-ab4f-5b5f907c125f%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/7801bc16-e0=
87-43ed-ab4f-5b5f907c125f%40isocpp.org?utm_medium=3Demail&utm_source=3Dfoot=
er>
> .
>

--=20
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 e=
mail 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/CADvuK0%2B1ZC60c%2B9ScSKNtu2id34E6wVnXzQ7WP61cKh=
u%2BeYARg%40mail.gmail.com.

--000000000000d94f3f05800fa4c0
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Why don&#39;t you just post your benchmark code? Why all t=
he graphs and &quot;oops here&#39;s the new graph&quot; and so on?</div><br=
><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Tue, J=
an 22, 2019 at 12:51 PM &lt;<a href=3D"mailto:joel.g.hemphill@gmail.com">jo=
el.g.hemphill@gmail.com</a>&gt; wrote:<br></div><blockquote class=3D"gmail_=
quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-=
style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir=
=3D"ltr">I wasn&#39;t aware of Google Benchmark before now. I will attempt =
to familiarize myself with it, so that I can get more accurate timings. In =
the meanwhile, below is my implementation of what I hope to propose. If the=
 results from Google Benchmark don&#39;t align with what I have presented, =
I sincerely apologize for the misinformation.<div><br></div><div><div class=
=3D"gmail-m_-1637743423785989120prettyprint" style=3D"background-color:rgb(=
250,250,250);border:1px solid rgb(187,187,187)"><code class=3D"gmail-m_-163=
7743423785989120prettyprint"><div class=3D"gmail-m_-1637743423785989120subp=
rettyprint"><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774342378=
5989120styled-by-prettify">__declspec</span><span style=3D"color:rgb(102,10=
2,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">(</span><spa=
n style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by=
-prettify">naked</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-=
m_-1637743423785989120styled-by-prettify">)</span><span style=3D"color:rgb(=
0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> __int32 _=
_fastcall powi</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_=
-1637743423785989120styled-by-prettify">(</span><span style=3D"color:rgb(0,=
0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">__int32 </sp=
an><span style=3D"color:rgb(0,0,136)" class=3D"gmail-m_-1637743423785989120=
styled-by-prettify">base</span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><span style=3D"=
color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
 __int32 exponent</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail=
-m_-1637743423785989120styled-by-prettify">)</span><span style=3D"color:rgb=
(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> </span><=
span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120st=
yled-by-prettify">{</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify"><br>=C2=A0 __asm </span><span styl=
e=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-p=
rettify">{</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743=
423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(=
136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// No St=
ack Usage</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(1=
36,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">/*-------=
 Prolog ---------*/</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"c=
olor:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"=
>//push ebp</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774=
3423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb=
(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">//mov e=
bp, esp</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423=
785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136=
,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">//sub esp, =
__LOCAL_SIZE</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rg=
b(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">/*----=
--------------------*/</span><span style=3D"color:rgb(0,0,0)" class=3D"gmai=
l-m_-1637743423785989120styled-by-prettify"><br><br><br>=C2=A0 </span><span=
 style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-b=
y-prettify">// Entry Register Values</span><span style=3D"color:rgb(0,0,0)"=
 class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 </span=
><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120st=
yled-by-prettify">//------------------------</span><span style=3D"color:rgb=
(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=
=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377434237=
85989120styled-by-prettify">// EAX =3D UNDEFINED</span><span style=3D"color=
:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=
=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify">// EBX =3D UNDEFINED</span><span style=3D"co=
lor:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><b=
r>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-163774=
3423785989120styled-by-prettify">// ECX =3D base</span><span style=3D"color=
:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=
=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify">// EDX =3D exponent</span><span style=3D"col=
or:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br=
>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743=
423785989120styled-by-prettify">// ESI =3D UNDEFINED</span><span style=3D"c=
olor:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><=
br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify">// EDI =3D UNDEFINED</span><span style=3D=
"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"=
><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-163=
7743423785989120styled-by-prettify">//------------------------</span><span =
style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-p=
rettify"><br><br><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify">// eax =3D 0</span><spa=
n style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by=
-prettify"><br>=C2=A0 xor eax</span><span style=3D"color:rgb(102,102,0)" cl=
ass=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pretti=
fy"> eax</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" =
class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br><br><br>=C2=A0=
 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377434237859=
89120styled-by-prettify">// if(exponent =3D=3D 0) { return 1; }</span><span=
 style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-=
prettify"><br>=C2=A0 test edx</span><span style=3D"color:rgb(102,102,0)" cl=
ass=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pretti=
fy"> edx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" =
class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 jnz if_=
zero_exp</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" =
class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 inc eax=
</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785=
989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D=
"gmail-m_-1637743423785989120styled-by-prettify"> </span><span style=3D"col=
or:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">/=
/ Set eax to 1</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163=
7743423785989120styled-by-prettify"><br>=C2=A0 jmp powi_exit</span><span st=
yle=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by=
-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify"><br>if_zero_exp</span><span style=3D"colo=
r:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
:</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989=
120styled-by-prettify"><br>=C2=A0<br>=C2=A0 </span><span style=3D"color:rgb=
(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// if(b=
ase =3D=3D 0) { return 0; }</span><span style=3D"color:rgb(0,0,0)" class=3D=
"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 test ecx</span>=
<span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120s=
tyled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-=
m_-1637743423785989120styled-by-prettify"> ecx</span><span style=3D"color:r=
gb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">;</=
span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120=
styled-by-prettify"><br>=C2=A0 jz powi_exit</span><span style=3D"color:rgb(=
102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">;</spa=
n><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120sty=
led-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0=
)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// ebx =3D base=
</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377434237859891=
20styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" =
class=3D"gmail-m_-1637743423785989120styled-by-prettify">// ecx =3D exponen=
t</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989=
120styled-by-prettify"><br>=C2=A0 mov ebx</span><span style=3D"color:rgb(10=
2,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span>=
<span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120style=
d-by-prettify"> ecx</span><span style=3D"color:rgb(102,102,0)" class=3D"gma=
il-m_-1637743423785989120styled-by-prettify">;</span><span style=3D"color:r=
gb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=
=A0 mov ecx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16=
37743423785989120styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0=
)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> edx</span><spa=
n style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120style=
d-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1=
637743423785989120styled-by-prettify"><br><br><br>=C2=A0<br>=C2=A0 </span><=
span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styl=
ed-by-prettify">// ecx =3D abs(exponent)</span><span style=3D"color:rgb(0,0=
,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 </=
span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377434237859891=
20styled-by-prettify">// edx =3D sign(exponent)</span><span style=3D"color:=
rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=
=C2=A0 sar edx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_=
-1637743423785989120styled-by-prettify">,</span><span style=3D"color:rgb(0,=
0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> </span><spa=
n style=3D"color:rgb(0,102,102)" class=3D"gmail-m_-1637743423785989120style=
d-by-prettify">31</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail=
-m_-1637743423785989120styled-by-prettify">;</span><span style=3D"color:rgb=
(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=
=A0 xor ecx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16=
37743423785989120styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0=
)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> edx</span><spa=
n style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120style=
d-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1=
637743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"colo=
r:rgb(0,0,136)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">su=
b</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989=
120styled-by-prettify"> ecx</span><span style=3D"color:rgb(102,102,0)" clas=
s=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><span style=3D=
"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"=
> edx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" cla=
ss=3D"gmail-m_-1637743423785989120styled-by-prettify"><br><br><br>=C2=A0 </=
span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377434237859891=
20styled-by-prettify">// Create a copy of the base, and move it to a tempor=
ary register</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify"><br>=C2=A0 mov esi</span><span style=3D"c=
olor:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettif=
y">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785=
989120styled-by-prettify"> ebx</span><span style=3D"color:rgb(102,102,0)" c=
lass=3D"gmail-m_-1637743423785989120styled-by-prettify">;</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pretti=
fy"><br>=C2=A0<br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D=
"gmail-m_-1637743423785989120styled-by-prettify">/* find abs(base) */</span=
><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styl=
ed-by-prettify"><br>=C2=A0 mov eax</span><span style=3D"color:rgb(102,102,0=
)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><span s=
tyle=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pr=
ettify"> ebx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1=
637743423785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,=
0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> </span><span =
style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by=
-prettify">// Copy the base to the accumulator</span><span style=3D"color:r=
gb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=
=A0 sar eax</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16=
37743423785989120styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0=
)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> </span><span s=
tyle=3D"color:rgb(0,102,102)" class=3D"gmail-m_-1637743423785989120styled-b=
y-prettify">31</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_=
-1637743423785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,=
0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> =C2=A0</spa=
n><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120s=
tyled-by-prettify">// Fill with sign bit</span><span style=3D"color:rgb(0,0=
,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 xo=
r ebx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)" cla=
ss=3D"gmail-m_-1637743423785989120styled-by-prettify"> eax</span><span styl=
e=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-p=
rettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743=
423785989120styled-by-prettify"> </span><span style=3D"color:rgb(136,0,0)" =
class=3D"gmail-m_-1637743423785989120styled-by-prettify">// Not the value, =
if sign bit is set</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_=
-1637743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"co=
lor:rgb(0,0,136)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
sub</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377434237859=
89120styled-by-prettify"> ebx</span><span style=3D"color:rgb(102,102,0)" cl=
ass=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pretti=
fy"> eax</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" =
class=3D"gmail-m_-1637743423785989120styled-by-prettify"> </span><span styl=
e=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pre=
ttify">// Subtract the sign bit, giving the absolute value</span><span styl=
e=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prett=
ify"><br>=C2=A0<br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify">// Return the copy to t=
he accumulator</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163=
7743423785989120styled-by-prettify"><br>=C2=A0 mov eax</span><span style=3D=
"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prett=
ify">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377434237=
85989120styled-by-prettify"> esi</span><span style=3D"color:rgb(102,102,0)"=
 class=3D"gmail-m_-1637743423785989120styled-by-prettify">;</span><span sty=
le=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pret=
tify"><br><br><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D=
"gmail-m_-1637743423785989120styled-by-prettify">// EAX =3D base</span><spa=
n style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by=
-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gm=
ail-m_-1637743423785989120styled-by-prettify">// EBX =3D abs(base)</span><s=
pan style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-=
by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"=
gmail-m_-1637743423785989120styled-by-prettify">// ECX =3D abs(exponent)</s=
pan><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120s=
tyled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" cla=
ss=3D"gmail-m_-1637743423785989120styled-by-prettify">// EDX =3D sign(expon=
ent)</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785=
989120styled-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color:rg=
b(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// if =
exponent is negative</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-=
m_-1637743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"=
color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify=
">/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D*/</span><span style=3D"color:rgb(0,0,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 test edx</sp=
an><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377434237859891=
20styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gma=
il-m_-1637743423785989120styled-by-prettify"> edx</span><span style=3D"colo=
r:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989=
120styled-by-prettify"><br>=C2=A0 jz if_exp_sign_eq_0</span><span style=3D"=
color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-pretti=
fy">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774342378=
5989120styled-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color:r=
gb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// if=
 abs(base) =3D=3D 1</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"c=
olor:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"=
>/*----------------------------*/</span><span style=3D"color:rgb(0,0,0)" cl=
ass=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 cmp ebx</=
span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-163774342378598=
9120styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)" class=3D"g=
mail-m_-1637743423785989120styled-by-prettify"> </span><span style=3D"color=
:rgb(0,102,102)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">1=
</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785=
989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D=
"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 jg if_base_gt_1=
</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785=
989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D=
"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 </span><span st=
yle=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-p=
rettify">// ecx =3D exponent &amp; 1</span><span style=3D"color:rgb(0,0,0)"=
 class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 </span=
><span style=3D"color:rgb(0,0,136)" class=3D"gmail-m_-1637743423785989120st=
yled-by-prettify">and</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail=
-m_-1637743423785989120styled-by-prettify"> ecx</span><span style=3D"color:=
rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">,<=
/span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774342378598912=
0styled-by-prettify"> ebx</span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify">;</span><span style=3D"=
color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
<br>=C2=A0<br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gma=
il-m_-1637743423785989120styled-by-prettify">// eax =3D exponent &amp; 1 ? =
(base &lt; 0 ? -1 : 1) : 0</span><span style=3D"color:rgb(0,0,0)" class=3D"=
gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 imul ecx</span><=
span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120st=
yled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify"><br><br><br>=C2=A0 </span><span st=
yle=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-p=
rettify">// ecx =3D exponent &amp; 1 ? 0 : 1</span><span style=3D"color:rgb=
(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=
=A0 xor ecx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16=
37743423785989120styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0=
)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> ebx</span><spa=
n style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120style=
d-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1=
637743423785989120styled-by-prettify"><br><br><br>=C2=A0 </span><span style=
=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pret=
tify">// eax =3D exponent &amp; 1 ? (base &lt; 0 ? -1 : 1) : 1</span><span =
style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-p=
rettify"><br>=C2=A0 add eax</span><span style=3D"color:rgb(102,102,0)" clas=
s=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><span style=3D=
"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"=
> ecx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" cla=
ss=3D"gmail-m_-1637743423785989120styled-by-prettify"><br><br><br>=C2=A0 </=
span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-16377434237859891=
20styled-by-prettify">// Return exponent &amp; 1 ? (base &lt; 0 ? -1 : 1) :=
 1</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774342378598=
9120styled-by-prettify"><br>=C2=A0 jmp powi_exit</span><span style=3D"color=
:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">;=
</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377434237859891=
20styled-by-prettify"><br>if_base_gt_1</span><span style=3D"color:rgb(102,1=
02,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">:</span><sp=
an style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-b=
y-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"g=
mail-m_-1637743423785989120styled-by-prettify">/*--------------------------=
--*/</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785=
989120styled-by-prettify"><br>=C2=A0<br>=C2=A0 </span><span style=3D"color:=
rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// R=
eturn 0</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423=
785989120styled-by-prettify"><br>=C2=A0 xor eax</span><span style=3D"color:=
rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">,<=
/span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774342378598912=
0styled-by-prettify"> eax</span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify">;</span><span style=3D"=
color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
<br>=C2=A0 jmp powi_exit</span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify">;</span><span style=3D"=
color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
<br><br><br>if_exp_sign_eq_0</span><span style=3D"color:rgb(102,102,0)" cla=
ss=3D"gmail-m_-1637743423785989120styled-by-prettify">:</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-pretti=
fy"><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-=
1637743423785989120styled-by-prettify">/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/</span><sp=
an style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-b=
y-prettify"><br><br><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" cl=
ass=3D"gmail-m_-1637743423785989120styled-by-prettify">/* if exponent =3D=
=3D 1, return base */</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail=
-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 dec ecx</span><span s=
tyle=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-b=
y-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637=
743423785989120styled-by-prettify"><br>=C2=A0 jz powi_exit</span><span styl=
e=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-p=
rettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743=
423785989120styled-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"co=
lor:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
// If base =3D=3D 2</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"c=
olor:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"=
>//cmp ebx, 2;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163=
7743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:=
rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">//jn=
e if_base_2;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377=
43423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rg=
b(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// sal=
 eax, cl;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(1=
36,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// ret;</=
span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120=
styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" cl=
ass=3D"gmail-m_-1637743423785989120styled-by-prettify">//if_base_2:</span><=
span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled=
-by-prettify"><br><br><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" =
class=3D"gmail-m_-1637743423785989120styled-by-prettify">/* Exponentiate th=
e multiplication */</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify"><br>=C2=A0 mov ebx</span><span sty=
le=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-=
prettify">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774=
3423785989120styled-by-prettify"> eax</span><span style=3D"color:rgb(102,10=
2,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">;</span><spa=
n style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by=
-prettify"><br>multiply</span><span style=3D"color:rgb(102,102,0)" class=3D=
"gmail-m_-1637743423785989120styled-by-prettify">:</span><span style=3D"col=
or:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br=
>=C2=A0 shr ecx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify">,</span><span style=3D"color:rgb(0=
,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> </span><sp=
an style=3D"color:rgb(0,102,102)" class=3D"gmail-m_-1637743423785989120styl=
ed-by-prettify">1</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail=
-m_-1637743423785989120styled-by-prettify">;</span><span style=3D"color:rgb=
(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> =C2=A0 =
=C2=A0</span><span style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-163774342=
3785989120styled-by-prettify">// Shift and check the first bit of the loop =
counter</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423=
785989120styled-by-prettify"><br>=C2=A0 jnc noMulByEBX<br>=C2=A0 imul ebx</=
span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-163774342378598=
9120styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D"g=
mail-m_-1637743423785989120styled-by-prettify"> =C2=A0</span><span style=3D=
"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettif=
y">// Multiply by the current multiplier</span><span style=3D"color:rgb(0,0=
,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>noMulByEB=
X</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-163774342378=
5989120styled-by-prettify">:</span><span style=3D"color:rgb(0,0,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify"><br>=C2=A0 imul ebx</sp=
an><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-16377434237859891=
20styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gma=
il-m_-1637743423785989120styled-by-prettify"> ebx</span><span style=3D"colo=
r:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989=
120styled-by-prettify"> </span><span style=3D"color:rgb(136,0,0)" class=3D"=
gmail-m_-1637743423785989120styled-by-prettify">// Square the multiplier</s=
pan><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120s=
tyled-by-prettify"><br>=C2=A0 test ecx</span><span style=3D"color:rgb(102,1=
02,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">,</span><sp=
an style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-b=
y-prettify"> ecx</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-=
m_-1637743423785989120styled-by-prettify">;</span><span style=3D"color:rgb(=
0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"> </span><s=
pan style=3D"color:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120style=
d-by-prettify">// Test if this was the last itteration</span><span style=3D=
"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"=
><br>=C2=A0 jnz multiply</span><span style=3D"color:rgb(102,102,0)" class=
=3D"gmail-m_-1637743423785989120styled-by-prettify">;</span><span style=3D"=
color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
<br><br><br>=C2=A0 </span><span style=3D"color:rgb(136,0,0)" class=3D"gmail=
-m_-1637743423785989120styled-by-prettify">/* Exit the function, returning =
the value of eax */</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m=
_-1637743423785989120styled-by-prettify"><br>powi_exit </span><span style=
=3D"color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-pr=
ettify">:</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16377434=
23785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(1=
36,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">// No sta=
ck usage</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774342=
3785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(13=
6,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">/*------- =
Epilog ---------*/</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_=
-1637743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"co=
lor:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">=
//mov esp, ebp;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-16=
37743423785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color=
:rgb(136,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">//p=
op ebp;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423=
785989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(136=
,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">/*---------=
---------------*/</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-=
1637743423785989120styled-by-prettify"><br>=C2=A0 ret</span><span style=3D"=
color:rgb(102,102,0)" class=3D"gmail-m_-1637743423785989120styled-by-pretti=
fy">;</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-163774342378=
5989120styled-by-prettify"><br>=C2=A0 </span><span style=3D"color:rgb(102,1=
02,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify">}</span><sp=
an style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-1637743423785989120styled-b=
y-prettify"><br></span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-=
m_-1637743423785989120styled-by-prettify">}</span><span style=3D"color:rgb(=
0,0,0)" class=3D"gmail-m_-1637743423785989120styled-by-prettify"><br></span=
></div></code></div><br><br>On Friday, January 18, 2019 at 10:59:21 PM UTC-=
8, Arthur O&#39;Dwyer wrote:<blockquote class=3D"gmail_quote" style=3D"marg=
in:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-l=
eft-color:rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"l=
tr">On Fri, Jan 18, 2019 at 8:12 PM &lt;<a rel=3D"nofollow">joel.g....@gmai=
l.com</a>&gt; wrote:<br></div><div class=3D"gmail_quote"><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;bo=
rder-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">=
<div dir=3D"ltr">The case you pointed out of using the double-type of the r=
eturn for &#39;pow(int, int)&#39; would be a major concern. Perhaps a worka=
round would be the requirement of an explicit template? i.e. &quot;double x=
 =3D std::pow(10, 20);&quot; would use overload 7, whereas &quot;std::pow&l=
t;int, int&gt;(10, 20)&quot; would return int? Alternatively, as Jake Arkin=
stall suggested, a new syntax for &#39;pow&#39; as &#39;power&#39; might be=
 in order, in which case, such contingencies wouldn&#39;t be as large a con=
cern. I would also argue that the above code segment is poor practice, as i=
t is relying upon the pow function to convert the two integers to doubles. =
More explicit typing would be preferred in most coding environments. Anothe=
r solution, as is implemented with powl and powf, is to use a single-letter=
 abbreviation to explicitly define the types used. i.e. powi.<div><br></div=
><div>As for the graph; I mentioned in a reply to my original posting that =
I have since found an issue with the testing method I used for graphing the=
 execution times for pow and powi. I have since done other tests as shown b=
elow [avg. of 20000 runs for powi, and 500 for pow (since the execution is =
longer, I decided to neglect the sample-count somewhat)]:</div><div><br></d=
iv><p style=3D"text-align:left;clear:both"><img src=3D"https://groups.googl=
e.com/a/isocpp.org/group/std-proposals/attach/146b13439f6332/Untitled2.png?=
part=3D0.1&amp;view=3D1&amp;authuser=3D2" alt=3D"Untitled2.png" width=3D"32=
0" height=3D"183" style=3D"margin-left: 1em; margin-right: 1em;"></p><p sty=
le=3D"text-align:left;clear:both">As you can see, powi does experience a gr=
adual increase in execution length with the increasing exponents (since it =
needs to do at worst [if an implementation were to use a simple linear appr=
oach, O(n) multiplications]).<br></p></div></blockquote><div>But really O(l=
g n) multiplications, right?</div><div>That graph looks a lot better (flatt=
er), but I&#39;d still have to see the code before I believe it. You say yo=
ur data was</div><div><br></div><div>&gt; gathered using &quot;std::chrono:=
:high_resolution_clock::now()&quot; surrounding for-loops executing the fun=
ctions</div><div><br></div><div>which pointedly omits any reference to e.g.=
 <a href=3D"https://github.com/google/benchmark" rel=3D"nofollow" target=3D=
"_blank">Google Benchmark</a> or ClobberMemory/DoNotOptimize. Which suggest=
s that your benchmark might not have been measuring anything meaningful.</d=
iv><div><br></div><div>=E2=80=93Arthur</div></div></div>
</blockquote></div></div>

<p></p>

-- <br>
You received this message because you are subscribed to a topic in the Goog=
le Groups &quot;ISO C++ Standard - Future Proposals&quot; group.<br>
To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/=
a/isocpp.org/d/topic/std-proposals/y9qMRNKrS2E/unsubscribe" target=3D"_blan=
k">https://groups.google.com/a/isocpp.org/d/topic/std-proposals/y9qMRNKrS2E=
/unsubscribe</a>.<br>
To unsubscribe from this group and all its topics, send an email to <a href=
=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_blank">std-prop=
osals+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/7801bc16-e087-43ed-ab4f-5b5f907c125f%=
40isocpp.org?utm_medium=3Demail&amp;utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/7801bc16-e087-=
43ed-ab4f-5b5f907c125f%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/CADvuK0%2B1ZC60c%2B9ScSKNtu2id34E6wVn=
XzQ7WP61cKhu%2BeYARg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0%2B1=
ZC60c%2B9ScSKNtu2id34E6wVnXzQ7WP61cKhu%2BeYARg%40mail.gmail.com</a>.<br />

--000000000000d94f3f05800fa4c0--

.