<br>Hi, <br>&nbsp;&nbsp;&nbsp;&nbsp; <br><div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>&nbsp;&nbsp; 1. Can you tell me the arithmetic's theory (douchuan)
<br><br><br><br>hi<br>&nbsp;&nbsp; I don't know what does the arithmetic say!<br>&nbsp;&nbsp; The result from a is 1000, then the result from b is 6.<br>&nbsp;&nbsp; I have optimized a system for a long time, but i find out i must<br>optimize all aspects, just a aspect isn't work.
<br>&nbsp;&nbsp; I want to know arithmetic's theory.<br><br><br>&nbsp;&nbsp; a.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long endPoints = (1000 + 1000 + 1000 + 1000 + 1000) / 5;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(endPoints &gt; 6208L)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoints = 6208L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long halfEndPoints = endPoints / 2L;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long l2 = endPoints - halfEndPoints;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long l3 = 1L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l3 = 1000L*1000L*1000L*1000L*1000L;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f(l3 != 0L)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(halfEndPoints &gt; 0L)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(l2 * l2 * l2 * l2 * l2 &gt; l3)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoints = l2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halfEndPoints /= 2L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l2 = endPoints - halfEndPoints;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoints = 0L;
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;endPoints: &quot; + endPoints);<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result :&nbsp;&nbsp;1000</blockquote><div><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The long type takes 64bits ,about 10^19 . Therefore there's no overflow.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I could see a&nbsp; limit arithmetic computation from this program:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assume&nbsp; endpoints = a ; halfendpoints = a/(2^n) (n -&gt; Infinite)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Obvious,from the arithmetic view, halfendpoints would be evalued as lim halfendpoints (n-&gt;Infinite). Then the arithmetic hardware might finally compute halfendpoints as 0 (divition computation is somehow platform dependent) . Therefore ,endPoints would be 1000.
<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> b.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long endPoints = (6000 + 1 + 1 + 1 + 1) / 5;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(endPoints &gt; 6208L)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoints = 6208L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long halfEndPoints = endPoints / 2L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long l2 = endPoints - halfEndPoints;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long l3 = 1L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l3 = 6000L*1L*1L*1L*1L;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f(l3 != 0L)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(halfEndPoints &gt; 0L)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(l2 * l2 * l2 * l2 * l2 &gt; l3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoints = l2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halfEndPoints /= 2L;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l2 = endPoints - halfEndPoints;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endPoints = 0L;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;endPoints: &quot; + endPoints);<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result : 6</blockquote>
<div><br>&nbsp; Similiar to the first program:<br>&nbsp; Assume endPoints = a , halfEndPoints = a/(2^n) (n-&gt;Infinite),in the previous program,endPoints keeps invariable,here in this case,both endPoints and halfEndPoints are variable.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; We can easily get the boudary value of l2 for &quot;if(l2 * l2 * l2 * l2 * l2 &gt; l3)&quot; ,x^5 &gt; l3 , the minimum value for x is 6. (5^5 &lt; 6000,6^5 &gt; 6000).<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; That means the program result would be no more than 6. Meaningwhile ,in the loop body,l2 = a&nbsp; - a/(2^n) (n-&gt;Infinite, a = l2 | l2^5&gt;l3).&nbsp; Through some analysis of the loop itself,we could find the endpoint &quot;a &quot; would be decoupled every two loop turn. So let a = v/2^t (t is the turn counts,v is our initial endpoints ,600).&nbsp; l2 = v/2^t - (v/2^t) / (2^n)&nbsp; ( l2 &lt;= 6 is our desired result). Now we could compute&nbsp; 600/2^t - (600/2^t)/(2^n) &lt;= 6.&nbsp; Since n tends to be infinite,we now get 600/2^t &lt;= 6. We could know the t value. Therefore,finally, the l2 value is 6, and then endPoints is 6, then we get the result 6. 
<br>&nbsp; &nbsp; &nbsp;&nbsp; Sorry, I could not describe this process clearly enough.&nbsp; This program result might vary when the hardware rounding algorithm varies. <br>&nbsp;<br>&nbsp; <br>&nbsp; This is my view towards your questions.pls tell me if I made some mistakes. thanks.
<br><br>Cheers<br>Sakur<br></div></div><br>