2017-01-11 19:58:08 +00:00
<!doctype html>
< html >
< head >
< title > lib/dconv/dragon4.cpp< / title >
< style type = "text/css" >
body { color:#000000; background-color:#ffffff }
body { font-family:Helvetica, sans-serif; font-size:10pt }
h1 { font-size:14pt }
.code { border-collapse:collapse; width:100%; }
.code { font-family: "Monospace", monospace; font-size:10pt }
.code { line-height: 1.2em }
.comment { color: green; font-style: oblique }
.keyword { color: blue }
.string_literal { color: red }
.directive { color: darkmagenta }
.expansion { display: none; }
.macro:hover .expansion { display: block; border: 2px solid #FF0000; padding: 2px; background-color:#FFF0F0; font-weight: normal; -webkit-border-radius:5px; -webkit-box-shadow:1px 1px 7px #000; position: absolute; top: -1em; left:10em; z-index: 1 }
.macro { color: darkmagenta; background-color:LemonChiffon; position: relative }
.num { width:2.5em; padding-right:2ex; background-color:#eeeeee }
.num { text-align:right; font-size:8pt }
.num { color:#444444 }
.line { padding-left: 1ex; border-left: 3px solid #ccc }
.line { white-space: pre }
.msg { -webkit-box-shadow:1px 1px 7px #000 }
.msg { -webkit-border-radius:5px }
.msg { font-family:Helvetica, sans-serif; font-size:8pt }
.msg { float:left }
.msg { padding:0.25em 1ex 0.25em 1ex }
.msg { margin-top:10px; margin-bottom:10px }
.msg { font-weight:bold }
.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap }
.msgT { padding:0x; spacing:0x }
.msgEvent { background-color:#fff8b4; color:#000000 }
.msgControl { background-color:#bbbbbb; color:#000000 }
.mrange { background-color:#dfddf3 }
.mrange { border-bottom:1px solid #6F9DBE }
.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; }
.PathIndex { -webkit-border-radius:8px }
.PathIndexEvent { background-color:#bfba87 }
.PathIndexControl { background-color:#8c8c8c }
.PathNav a { text-decoration:none; font-size: larger }
.CodeInsertionHint { font-weight: bold; background-color: #10dd10 }
.CodeRemovalHint { background-color:#de1010 }
.CodeRemovalHint { border-bottom:1px solid #6F9DBE }
table.simpletable {
padding: 5px;
font-size:12pt;
margin:20px;
border-collapse: collapse; border-spacing: 0px;
}
td.rowname {
text-align:right; font-weight:bold; color:#444444;
padding-right:2ex; }
< / style >
< / head >
< body >
<!-- BUGDESC The left operand of ' - ' is a garbage value -->
<!-- BUGTYPE Result of operation is garbage or undefined -->
<!-- BUGCATEGORY Logic error -->
<!-- BUGFILE /home/carsten/amath/lib/dconv/dragon4.cpp -->
<!-- FILENAME dragon4.cpp -->
<!-- FUNCTIONNAME BigInt_DivideWithRemainder_MaxQuotient9 -->
<!-- ISSUEHASHCONTENTOFLINEINCONTEXT b0a6c18bddcaeef03c3ba40feb5f7f2d -->
<!-- BUGLINE 631 -->
<!-- BUGCOLUMN 51 -->
<!-- BUGPATHLENGTH 38 -->
<!-- BUGMETAEND -->
<!-- REPORTHEADER -->
< h3 > Bug Summary< / h3 >
< table class = "simpletable" >
2017-01-28 21:14:35 +00:00
< tr > < td class = "rowname" > File:< / td > < td > dconv/dragon4.cpp< / td > < / tr >
2017-01-11 19:58:08 +00:00
< tr > < td class = "rowname" > Location:< / td > < td > < a href = "#EndPath" > line 631, column 51< / a > < / td > < / tr >
< tr > < td class = "rowname" > Description:< / td > < td > The left operand of '-' is a garbage value< / td > < / tr >
< / table >
<!-- REPORTSUMMARYEXTRA -->
< h3 > Annotated Source Code< / h3 >
< table class = "code" >
< tr > < td class = "num" id = "LN1" > 1< / td > < td class = "line" > < span class = 'comment' > /******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN2" > 2< / td > < td class = "line" > < span class = 'comment' > Copyright (c) 2014 Ryan Juckett< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN3" > 3< / td > < td class = "line" > < span class = 'comment' > http://www.ryanjuckett.com/< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN4" > 4< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN5" > 5< / td > < td class = "line" > < span class = 'comment' > This software is provided 'as-is', without any express or implied< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN6" > 6< / td > < td class = "line" > < span class = 'comment' > warranty. In no event will the authors be held liable for any damages< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN7" > 7< / td > < td class = "line" > < span class = 'comment' > arising from the use of this software.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN8" > 8< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN9" > 9< / td > < td class = "line" > < span class = 'comment' > Permission is granted to anyone to use this software for any purpose,< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN10" > 10< / td > < td class = "line" > < span class = 'comment' > including commercial applications, and to alter it and redistribute it< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN11" > 11< / td > < td class = "line" > < span class = 'comment' > freely, subject to the following restrictions:< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN12" > 12< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN13" > 13< / td > < td class = "line" > < span class = 'comment' > 1. The origin of this software must not be misrepresented; you must not< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN14" > 14< / td > < td class = "line" > < span class = 'comment' > claim that you wrote the original software. If you use this software< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN15" > 15< / td > < td class = "line" > < span class = 'comment' > in a product, an acknowledgment in the product documentation would be< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN16" > 16< / td > < td class = "line" > < span class = 'comment' > appreciated but is not required.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN17" > 17< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN18" > 18< / td > < td class = "line" > < span class = 'comment' > 2. Altered source versions must be plainly marked as such, and must not be< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN19" > 19< / td > < td class = "line" > < span class = 'comment' > misrepresented as being the original software.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN20" > 20< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN21" > 21< / td > < td class = "line" > < span class = 'comment' > 3. This notice may not be removed or altered from any source< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN22" > 22< / td > < td class = "line" > < span class = 'comment' > distribution.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN23" > 23< / td > < td class = "line" > < span class = 'comment' > *******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN24" > 24< / td > < td class = "line" > < span class = 'comment' > Copyright (c) 2015-2017 Carsten Sonne Larsen < cs@innolan.dk> < / span > < / td > < / tr >
< tr > < td class = "num" id = "LN25" > 25< / td > < td class = "line" > < span class = 'comment' > All rights reserved.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN26" > 26< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN27" > 27< / td > < td class = "line" > < span class = 'comment' > Redistribution and use in source and binary forms, with or without< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN28" > 28< / td > < td class = "line" > < span class = 'comment' > modification, are permitted provided that the following conditions< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN29" > 29< / td > < td class = "line" > < span class = 'comment' > are met:< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN30" > 30< / td > < td class = "line" > < span class = 'comment' > 1. Redistributions of source code must retain the above copyright< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN31" > 31< / td > < td class = "line" > < span class = 'comment' > notice, this list of conditions and the following disclaimer.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN32" > 32< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN33" > 33< / td > < td class = "line" > < span class = 'comment' > 2. Redistributions in binary form must reproduce the above copyright< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN34" > 34< / td > < td class = "line" > < span class = 'comment' > notice, this list of conditions and the following disclaimer in the< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN35" > 35< / td > < td class = "line" > < span class = 'comment' > documentation and/or other materials provided with the distribution.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN36" > 36< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN37" > 37< / td > < td class = "line" > < span class = 'comment' > THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN38" > 38< / td > < td class = "line" > < span class = 'comment' > IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN39" > 39< / td > < td class = "line" > < span class = 'comment' > OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN40" > 40< / td > < td class = "line" > < span class = 'comment' > IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN41" > 41< / td > < td class = "line" > < span class = 'comment' > INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN42" > 42< / td > < td class = "line" > < span class = 'comment' > NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN43" > 43< / td > < td class = "line" > < span class = 'comment' > DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN44" > 44< / td > < td class = "line" > < span class = 'comment' > THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN45" > 45< / td > < td class = "line" > < span class = 'comment' > (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN46" > 46< / td > < td class = "line" > < span class = 'comment' > THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN47" > 47< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN48" > 48< / td > < td class = "line" > < span class = 'comment' > The origin source code can be obtained from:< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN49" > 49< / td > < td class = "line" > < span class = 'comment' > http://www.ryanjuckett.com/< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN50" > 50< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN51" > 51< / td > < td class = "line" > < span class = 'comment' > ******************************************************************************/< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN52" > 52< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN53" > 53< / td > < td class = "line" > < span class = 'directive' > #include "math.h"< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN54" > 54< / td > < td class = "line" > < span class = 'directive' > #include "dmath.h"< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN55" > 55< / td > < td class = "line" > < span class = 'directive' > #include "dragon4.h"< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN56" > 56< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN57" > 57< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN58" > 58< / td > < td class = "line" > < span class = 'comment' > // Maximum number of 32 bit blocks needed in high precision arithmetic< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN59" > 59< / td > < td class = "line" > < span class = 'comment' > // to print out 64 bit IEEE floating point values.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN60" > 60< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN61" > 61< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 c_BigInt_MaxBlocks = 35;< / td > < / tr >
< tr > < td class = "num" id = "LN62" > 62< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN63" > 63< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN64" > 64< / td > < td class = "line" > < span class = 'comment' > // This structure stores a high precision unsigned integer. It uses a buffer< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN65" > 65< / td > < td class = "line" > < span class = 'comment' > // of 32 bit integer blocks along with a length. The lowest bits of the integer< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN66" > 66< / td > < td class = "line" > < span class = 'comment' > // are stored at the start of the buffer and the length is set to the minimum< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN67" > 67< / td > < td class = "line" > < span class = 'comment' > // value that contains the integer. Thus, there are never any zero blocks at the< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN68" > 68< / td > < td class = "line" > < span class = 'comment' > // end of the buffer.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN69" > 69< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN70" > 70< / td > < td class = "line" > < span class = 'keyword' > struct< / span > tBigInt< / td > < / tr >
< tr > < td class = "num" id = "LN71" > 71< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN72" > 72< / td > < td class = "line" > < span class = 'comment' > // Copy integer< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN73" > 73< / td > < td class = "line" > tBigInt & < span class = 'keyword' > operator< / span > =(< span class = 'keyword' > const< / span > tBigInt & rhs)< / td > < / tr >
< tr > < td class = "num" id = "LN74" > 74< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN75" > 75< / td > < td class = "line" > tU32 length = rhs.m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN76" > 76< / td > < td class = "line" > tU32 * pLhsCur = m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN77" > 77< / td > < td class = "line" > < span class = 'keyword' > for< / span > (< span class = 'keyword' > const< / span > tU32 *pRhsCur = rhs.m_blocks, *pRhsEnd = pRhsCur + length;< / td > < / tr >
< tr > < td class = "num" id = "LN78" > 78< / td > < td class = "line" > pRhsCur != pRhsEnd;< / td > < / tr >
< tr > < td class = "num" id = "LN79" > 79< / td > < td class = "line" > ++pLhsCur, ++pRhsCur)< / td > < / tr >
< tr > < td class = "num" id = "LN80" > 80< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN81" > 81< / td > < td class = "line" > *pLhsCur = *pRhsCur;< / td > < / tr >
< tr > < td class = "num" id = "LN82" > 82< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN83" > 83< / td > < td class = "line" > m_length = length;< / td > < / tr >
< tr > < td class = "num" id = "LN84" > 84< / td > < td class = "line" > < span class = 'keyword' > return< / span > *< span class = 'keyword' > this< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN85" > 85< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN86" > 86< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN87" > 87< / td > < td class = "line" > < span class = 'comment' > // Data accessors< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN88" > 88< / td > < td class = "line" > tU32 GetLength() < span class = 'keyword' > const< / span > {< / td > < / tr >
< tr > < td class = "num" id = "LN89" > 89< / td > < td class = "line" > < span class = 'keyword' > return< / span > m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN90" > 90< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN91" > 91< / td > < td class = "line" > tU32 GetBlock(tU32 idx) < span class = 'keyword' > const< / span > {< / td > < / tr >
< tr > < td class = "num" id = "LN92" > 92< / td > < td class = "line" > < span class = 'keyword' > return< / span > m_blocks[idx];< / td > < / tr >
< tr > < td class = "num" id = "LN93" > 93< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN94" > 94< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN95" > 95< / td > < td class = "line" > < span class = 'comment' > // Zero helper functions< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN96" > 96< / td > < td class = "line" > < span class = 'keyword' > void< / span > SetZero() {< / td > < / tr >
< tr > < td class = "num" id = "LN97" > 97< / td > < td class = "line" > m_length = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN98" > 98< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN99" > 99< / td > < td class = "line" > tB IsZero() < span class = 'keyword' > const< / span > {< / td > < / tr >
< tr > < td class = "num" id = "LN100" > 100< / td > < td class = "line" > < span class = 'keyword' > return< / span > m_length == 0;< / td > < / tr >
< tr > < td class = "num" id = "LN101" > 101< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN102" > 102< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN103" > 103< / td > < td class = "line" > < span class = 'comment' > // Basic type accessors< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN104" > 104< / td > < td class = "line" > < span class = 'keyword' > void< / span > SetU64(tU64 val)< / td > < / tr >
< tr > < td class = "num" id = "LN105" > 105< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN106" > 106< / td > < td class = "line" > < span class = 'keyword' > if< / span > (val > 0xFFFFFFFF)< / td > < / tr >
< tr > < td class = "num" id = "LN107" > 107< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN108" > 108< / td > < td class = "line" > m_blocks[0] = val & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN109" > 109< / td > < td class = "line" > m_blocks[1] = (val > > 32) & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN110" > 110< / td > < td class = "line" > m_length = 2;< / td > < / tr >
< tr > < td class = "num" id = "LN111" > 111< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN112" > 112< / td > < td class = "line" > < span class = 'keyword' > else< / span > < span class = 'keyword' > if< / span > (val != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN113" > 113< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN114" > 114< / td > < td class = "line" > m_blocks[0] = val & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN115" > 115< / td > < td class = "line" > m_length = 1;< / td > < / tr >
< tr > < td class = "num" id = "LN116" > 116< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN117" > 117< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN118" > 118< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN119" > 119< / td > < td class = "line" > m_length = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN120" > 120< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN121" > 121< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN122" > 122< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN123" > 123< / td > < td class = "line" > < span class = 'keyword' > void< / span > SetU32(tU32 val)< / td > < / tr >
< tr > < td class = "num" id = "LN124" > 124< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN125" > 125< / td > < td class = "line" > < span class = 'keyword' > if< / span > (val != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN126" > 126< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN127" > 127< / td > < td class = "line" > m_blocks[0] = val;< / td > < / tr >
< tr > < td class = "num" id = "LN128" > 128< / td > < td class = "line" > m_length = (val != 0);< / td > < / tr >
< tr > < td class = "num" id = "LN129" > 129< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN130" > 130< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN131" > 131< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN132" > 132< / td > < td class = "line" > m_length = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN133" > 133< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN134" > 134< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN135" > 135< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN136" > 136< / td > < td class = "line" > tU32 GetU32() < span class = 'keyword' > const< / span > {< / td > < / tr >
< tr > < td class = "num" id = "LN137" > 137< / td > < td class = "line" > < span class = 'keyword' > return< / span > (m_length == 0) ? 0 : m_blocks[0];< / td > < / tr >
< tr > < td class = "num" id = "LN138" > 138< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN139" > 139< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN140" > 140< / td > < td class = "line" > < span class = 'comment' > // Member data< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN141" > 141< / td > < td class = "line" > tU32 m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN142" > 142< / td > < td class = "line" > tU32 m_blocks[c_BigInt_MaxBlocks];< / td > < / tr >
< tr > < td class = "num" id = "LN143" > 143< / td > < td class = "line" > };< / td > < / tr >
< tr > < td class = "num" id = "LN144" > 144< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN145" > 145< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN146" > 146< / td > < td class = "line" > < span class = 'comment' > // Returns 0 if (lhs = rhs), negative if (lhs < rhs), positive if (lhs > rhs)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN147" > 147< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN148" > 148< / td > < td class = "line" > < span class = 'keyword' > static< / span > tS32 BigInt_Compare(< span class = 'keyword' > const< / span > tBigInt & lhs, < span class = 'keyword' > const< / span > tBigInt & rhs)< / td > < / tr >
< tr > < td class = "num" id = "LN149" > 149< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN150" > 150< / td > < td class = "line" > < span class = 'comment' > // A bigger length implies a bigger number.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN151" > 151< / td > < td class = "line" > tS32 lengthDiff = lhs.m_length - rhs.m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN152" > 152< / td > < td class = "line" > < span class = 'keyword' > if< / span > (lengthDiff != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN153" > 153< / td > < td class = "line" > < span class = 'keyword' > return< / span > lengthDiff;< / td > < / tr >
< tr > < td class = "num" id = "LN154" > 154< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN155" > 155< / td > < td class = "line" > < span class = 'comment' > // Compare blocks one by one from high to low.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN156" > 156< / td > < td class = "line" > < span class = 'keyword' > for< / span > (tS32 i = lhs.m_length - 1; i > = 0; --i)< / td > < / tr >
< tr > < td class = "num" id = "LN157" > 157< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN158" > 158< / td > < td class = "line" > < span class = 'keyword' > if< / span > (lhs.m_blocks[i] == rhs.m_blocks[i])< / td > < / tr >
< tr > < td class = "num" id = "LN159" > 159< / td > < td class = "line" > < span class = 'keyword' > continue< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN160" > 160< / td > < td class = "line" > < span class = 'keyword' > else< / span > < span class = 'keyword' > if< / span > (lhs.m_blocks[i] > rhs.m_blocks[i])< / td > < / tr >
< tr > < td class = "num" id = "LN161" > 161< / td > < td class = "line" > < span class = 'keyword' > return< / span > 1;< / td > < / tr >
< tr > < td class = "num" id = "LN162" > 162< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN163" > 163< / td > < td class = "line" > < span class = 'keyword' > return< / span > -1;< / td > < / tr >
< tr > < td class = "num" id = "LN164" > 164< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN165" > 165< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN166" > 166< / td > < td class = "line" > < span class = 'comment' > // no blocks differed< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN167" > 167< / td > < td class = "line" > < span class = 'keyword' > return< / span > 0;< / td > < / tr >
< tr > < td class = "num" id = "LN168" > 168< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN169" > 169< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN170" > 170< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN171" > 171< / td > < td class = "line" > < span class = 'comment' > // result = lhs + rhs< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN172" > 172< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN173" > 173< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_Add(tBigInt * pResult, < span class = 'keyword' > const< / span > tBigInt & lhs, < span class = 'keyword' > const< / span > tBigInt & rhs)< / td > < / tr >
< tr > < td class = "num" id = "LN174" > 174< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN175" > 175< / td > < td class = "line" > < span class = 'comment' > // determine which operand has the smaller length< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN176" > 176< / td > < td class = "line" > < span class = 'keyword' > const< / span > tBigInt * pLarge;< / td > < / tr >
< tr > < td class = "num" id = "LN177" > 177< / td > < td class = "line" > < span class = 'keyword' > const< / span > tBigInt * pSmall;< / td > < / tr >
< tr > < td class = "num" id = "LN178" > 178< / td > < td class = "line" > < span class = 'keyword' > if< / span > (lhs.m_length < rhs.m_length)< / td > < / tr >
< tr > < td class = "num" id = "LN179" > 179< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN180" > 180< / td > < td class = "line" > pSmall = & lhs;< / td > < / tr >
< tr > < td class = "num" id = "LN181" > 181< / td > < td class = "line" > pLarge = & rhs;< / td > < / tr >
< tr > < td class = "num" id = "LN182" > 182< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN183" > 183< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN184" > 184< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN185" > 185< / td > < td class = "line" > pSmall = & rhs;< / td > < / tr >
< tr > < td class = "num" id = "LN186" > 186< / td > < td class = "line" > pLarge = & lhs;< / td > < / tr >
< tr > < td class = "num" id = "LN187" > 187< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN188" > 188< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN189" > 189< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 largeLen = pLarge-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN190" > 190< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 smallLen = pSmall-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN191" > 191< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN192" > 192< / td > < td class = "line" > < span class = 'comment' > // The output will be at least as long as the largest input< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN193" > 193< / td > < td class = "line" > pResult-> m_length = largeLen;< / td > < / tr >
< tr > < td class = "num" id = "LN194" > 194< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN195" > 195< / td > < td class = "line" > < span class = 'comment' > // Add each block and add carry the overflow to the next block< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN196" > 196< / td > < td class = "line" > tU64 carry = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN197" > 197< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 * pLargeCur = pLarge-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN198" > 198< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 * pLargeEnd = pLargeCur + largeLen;< / td > < / tr >
< tr > < td class = "num" id = "LN199" > 199< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 * pSmallCur = pSmall-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN200" > 200< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 * pSmallEnd = pSmallCur + smallLen;< / td > < / tr >
< tr > < td class = "num" id = "LN201" > 201< / td > < td class = "line" > tU32 * pResultCur = pResult-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN202" > 202< / td > < td class = "line" > < span class = 'keyword' > while< / span > (pSmallCur != pSmallEnd)< / td > < / tr >
< tr > < td class = "num" id = "LN203" > 203< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN204" > 204< / td > < td class = "line" > tU64 sum = carry + (tU64)(*pLargeCur) + (tU64)(*pSmallCur);< / td > < / tr >
< tr > < td class = "num" id = "LN205" > 205< / td > < td class = "line" > carry = sum > > 32;< / td > < / tr >
< tr > < td class = "num" id = "LN206" > 206< / td > < td class = "line" > (*pResultCur) = sum & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN207" > 207< / td > < td class = "line" > ++pLargeCur;< / td > < / tr >
< tr > < td class = "num" id = "LN208" > 208< / td > < td class = "line" > ++pSmallCur;< / td > < / tr >
< tr > < td class = "num" id = "LN209" > 209< / td > < td class = "line" > ++pResultCur;< / td > < / tr >
< tr > < td class = "num" id = "LN210" > 210< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN211" > 211< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN212" > 212< / td > < td class = "line" > < span class = 'comment' > // Add the carry to any blocks that only exist in the large operand< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN213" > 213< / td > < td class = "line" > < span class = 'keyword' > while< / span > (pLargeCur != pLargeEnd)< / td > < / tr >
< tr > < td class = "num" id = "LN214" > 214< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN215" > 215< / td > < td class = "line" > tU64 sum = carry + (tU64)(*pLargeCur);< / td > < / tr >
< tr > < td class = "num" id = "LN216" > 216< / td > < td class = "line" > carry = sum > > 32;< / td > < / tr >
< tr > < td class = "num" id = "LN217" > 217< / td > < td class = "line" > (*pResultCur) = sum & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN218" > 218< / td > < td class = "line" > ++pLargeCur;< / td > < / tr >
< tr > < td class = "num" id = "LN219" > 219< / td > < td class = "line" > ++pResultCur;< / td > < / tr >
< tr > < td class = "num" id = "LN220" > 220< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN221" > 221< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN222" > 222< / td > < td class = "line" > < span class = 'comment' > // If there's still a carry, append a new block< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN223" > 223< / td > < td class = "line" > < span class = 'keyword' > if< / span > (carry != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN224" > 224< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN225" > 225< / td > < td class = "line" > RJ_ASSERT(carry == 1);< / td > < / tr >
< tr > < td class = "num" id = "LN226" > 226< / td > < td class = "line" > RJ_ASSERT((tU32)(pResultCur - pResult-> m_blocks) == largeLen & & (largeLen < c_BigInt_MaxBlocks));< / td > < / tr >
< tr > < td class = "num" id = "LN227" > 227< / td > < td class = "line" > *pResultCur = 1;< / td > < / tr >
< tr > < td class = "num" id = "LN228" > 228< / td > < td class = "line" > pResult-> m_length = largeLen + 1;< / td > < / tr >
< tr > < td class = "num" id = "LN229" > 229< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN230" > 230< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN231" > 231< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN232" > 232< / td > < td class = "line" > pResult-> m_length = largeLen;< / td > < / tr >
< tr > < td class = "num" id = "LN233" > 233< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN234" > 234< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN235" > 235< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN236" > 236< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN237" > 237< / td > < td class = "line" > < span class = 'comment' > // result = lhs * rhs< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN238" > 238< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN239" > 239< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_Multiply(tBigInt * pResult, < span class = 'keyword' > const< / span > tBigInt & lhs, < span class = 'keyword' > const< / span > tBigInt & rhs)< / td > < / tr >
< tr > < td class = "num" id = "LN240" > 240< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN241" > 241< / td > < td class = "line" > RJ_ASSERT( pResult != & lhs & & pResult != & rhs );< / td > < / tr >
< tr > < td class = "num" id = "LN242" > 242< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN243" > 243< / td > < td class = "line" > < span class = 'comment' > // determine which operand has the smaller length< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN244" > 244< / td > < td class = "line" > < span class = 'keyword' > const< / span > tBigInt * pLarge;< / td > < / tr >
< tr > < td class = "num" id = "LN245" > 245< / td > < td class = "line" > < span class = 'keyword' > const< / span > tBigInt * pSmall;< / td > < / tr >
< tr > < td class = "num" id = "LN246" > 246< / td > < td class = "line" > < span class = 'keyword' > if< / span > (lhs.m_length < rhs.m_length)< / td > < / tr >
< tr > < td class = "num" id = "LN247" > 247< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN248" > 248< / td > < td class = "line" > pSmall = & lhs;< / td > < / tr >
< tr > < td class = "num" id = "LN249" > 249< / td > < td class = "line" > pLarge = & rhs;< / td > < / tr >
< tr > < td class = "num" id = "LN250" > 250< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN251" > 251< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN252" > 252< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN253" > 253< / td > < td class = "line" > pSmall = & rhs;< / td > < / tr >
< tr > < td class = "num" id = "LN254" > 254< / td > < td class = "line" > pLarge = & lhs;< / td > < / tr >
< tr > < td class = "num" id = "LN255" > 255< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN256" > 256< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN257" > 257< / td > < td class = "line" > < span class = 'comment' > // set the maximum possible result length< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN258" > 258< / td > < td class = "line" > tU32 maxResultLen = pLarge-> m_length + pSmall-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN259" > 259< / td > < td class = "line" > RJ_ASSERT( maxResultLen < = c_BigInt_MaxBlocks );< / td > < / tr >
< tr > < td class = "num" id = "LN260" > 260< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN261" > 261< / td > < td class = "line" > < span class = 'comment' > // clear the result data< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN262" > 262< / td > < td class = "line" > < span class = 'keyword' > for< / span > (tU32 * pCur = pResult-> m_blocks, *pEnd = pCur + maxResultLen; pCur != pEnd; ++pCur)< / td > < / tr >
< tr > < td class = "num" id = "LN263" > 263< / td > < td class = "line" > *pCur = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN264" > 264< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN265" > 265< / td > < td class = "line" > < span class = 'comment' > // perform standard long multiplication< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN266" > 266< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pLargeBeg = pLarge-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN267" > 267< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pLargeEnd = pLargeBeg + pLarge-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN268" > 268< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN269" > 269< / td > < td class = "line" > < span class = 'comment' > // for each small block< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN270" > 270< / td > < td class = "line" > tU32 *pResultStart = pResult-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN271" > 271< / td > < td class = "line" > < span class = 'keyword' > for< / span > (< span class = 'keyword' > const< / span > tU32 *pSmallCur = pSmall-> m_blocks, *pSmallEnd = pSmallCur + pSmall-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN272" > 272< / td > < td class = "line" > pSmallCur != pSmallEnd;< / td > < / tr >
< tr > < td class = "num" id = "LN273" > 273< / td > < td class = "line" > ++pSmallCur, ++pResultStart)< / td > < / tr >
< tr > < td class = "num" id = "LN274" > 274< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN275" > 275< / td > < td class = "line" > < span class = 'comment' > // if non-zero, multiply against all the large blocks and add into the result< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN276" > 276< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 multiplier = *pSmallCur;< / td > < / tr >
< tr > < td class = "num" id = "LN277" > 277< / td > < td class = "line" > < span class = 'keyword' > if< / span > (multiplier != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN278" > 278< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN279" > 279< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pLargeCur = pLargeBeg;< / td > < / tr >
< tr > < td class = "num" id = "LN280" > 280< / td > < td class = "line" > tU32 *pResultCur = pResultStart;< / td > < / tr >
< tr > < td class = "num" id = "LN281" > 281< / td > < td class = "line" > tU64 carry = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN282" > 282< / td > < td class = "line" > < span class = 'keyword' > do< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN283" > 283< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN284" > 284< / td > < td class = "line" > tU64 product = (*pResultCur) + (*pLargeCur)*(tU64)multiplier + carry;< / td > < / tr >
< tr > < td class = "num" id = "LN285" > 285< / td > < td class = "line" > carry = product > > 32;< / td > < / tr >
< tr > < td class = "num" id = "LN286" > 286< / td > < td class = "line" > *pResultCur = product & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN287" > 287< / td > < td class = "line" > ++pLargeCur;< / td > < / tr >
< tr > < td class = "num" id = "LN288" > 288< / td > < td class = "line" > ++pResultCur;< / td > < / tr >
< tr > < td class = "num" id = "LN289" > 289< / td > < td class = "line" > } < span class = 'keyword' > while< / span > (pLargeCur != pLargeEnd);< / td > < / tr >
< tr > < td class = "num" id = "LN290" > 290< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN291" > 291< / td > < td class = "line" > RJ_ASSERT(pResultCur < pResult-> m_blocks + maxResultLen);< / td > < / tr >
< tr > < td class = "num" id = "LN292" > 292< / td > < td class = "line" > *pResultCur = (tU32)(carry & 0xFFFFFFFF);< / td > < / tr >
< tr > < td class = "num" id = "LN293" > 293< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN294" > 294< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN295" > 295< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN296" > 296< / td > < td class = "line" > < span class = 'comment' > // check if the terminating block has no set bits< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN297" > 297< / td > < td class = "line" > < span class = 'keyword' > if< / span > (maxResultLen > 0 & & pResult-> m_blocks[maxResultLen - 1] == 0)< / td > < / tr >
< tr > < td class = "num" id = "LN298" > 298< / td > < td class = "line" > pResult-> m_length = maxResultLen-1;< / td > < / tr >
< tr > < td class = "num" id = "LN299" > 299< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN300" > 300< / td > < td class = "line" > pResult-> m_length = maxResultLen;< / td > < / tr >
< tr > < td class = "num" id = "LN301" > 301< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN302" > 302< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN303" > 303< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN304" > 304< / td > < td class = "line" > < span class = 'comment' > // result = lhs * rhs< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN305" > 305< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN306" > 306< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_Multiply(tBigInt * pResult, < span class = 'keyword' > const< / span > tBigInt & lhs, tU32 rhs)< / td > < / tr >
< tr > < td class = "num" id = "LN307" > 307< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN308" > 308< / td > < td class = "line" > < span class = 'comment' > // perform long multiplication< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN309" > 309< / td > < td class = "line" > tU32 carry = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN310" > 310< / td > < td class = "line" > tU32 *pResultCur = pResult-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN311" > 311< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pLhsCur = lhs.m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN312" > 312< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pLhsEnd = lhs.m_blocks + lhs.m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN313" > 313< / td > < td class = "line" > < span class = 'keyword' > for< / span > ( ; pLhsCur != pLhsEnd; ++pLhsCur, ++pResultCur )< / td > < / tr >
< tr > < td class = "num" id = "LN314" > 314< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN315" > 315< / td > < td class = "line" > tU64 product = (tU64)(*pLhsCur) * rhs + carry;< / td > < / tr >
< tr > < td class = "num" id = "LN316" > 316< / td > < td class = "line" > *pResultCur = (tU32)(product & 0xFFFFFFFF);< / td > < / tr >
< tr > < td class = "num" id = "LN317" > 317< / td > < td class = "line" > carry = product > > 32;< / td > < / tr >
< tr > < td class = "num" id = "LN318" > 318< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN319" > 319< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN320" > 320< / td > < td class = "line" > < span class = 'comment' > // if there is a remaining carry, grow the array< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN321" > 321< / td > < td class = "line" > < span class = 'keyword' > if< / span > (carry != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN322" > 322< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN323" > 323< / td > < td class = "line" > < span class = 'comment' > // grow the array< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN324" > 324< / td > < td class = "line" > RJ_ASSERT(lhs.m_length + 1 < = c_BigInt_MaxBlocks);< / td > < / tr >
< tr > < td class = "num" id = "LN325" > 325< / td > < td class = "line" > *pResultCur = (tU32)carry;< / td > < / tr >
< tr > < td class = "num" id = "LN326" > 326< / td > < td class = "line" > pResult-> m_length = lhs.m_length + 1;< / td > < / tr >
< tr > < td class = "num" id = "LN327" > 327< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN328" > 328< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN329" > 329< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN330" > 330< / td > < td class = "line" > pResult-> m_length = lhs.m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN331" > 331< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN332" > 332< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN333" > 333< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN334" > 334< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN335" > 335< / td > < td class = "line" > < span class = 'comment' > // result = in * 2< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN336" > 336< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN337" > 337< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_Multiply2(tBigInt * pResult, < span class = 'keyword' > const< / span > tBigInt & in)< / td > < / tr >
< tr > < td class = "num" id = "LN338" > 338< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN339" > 339< / td > < td class = "line" > < span class = 'comment' > // shift all the blocks by one< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN340" > 340< / td > < td class = "line" > tU32 carry = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN341" > 341< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN342" > 342< / td > < td class = "line" > tU32 *pResultCur = pResult-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN343" > 343< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pLhsCur = in.m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN344" > 344< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pLhsEnd = in.m_blocks + in.m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN345" > 345< / td > < td class = "line" > < span class = 'keyword' > for< / span > ( ; pLhsCur != pLhsEnd; ++pLhsCur, ++pResultCur )< / td > < / tr >
< tr > < td class = "num" id = "LN346" > 346< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN347" > 347< / td > < td class = "line" > tU32 cur = *pLhsCur;< / td > < / tr >
< tr > < td class = "num" id = "LN348" > 348< / td > < td class = "line" > *pResultCur = (cur < < 1) | carry;< / td > < / tr >
< tr > < td class = "num" id = "LN349" > 349< / td > < td class = "line" > carry = cur > > 31;< / td > < / tr >
< tr > < td class = "num" id = "LN350" > 350< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN351" > 351< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN352" > 352< / td > < td class = "line" > < span class = 'keyword' > if< / span > (carry != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN353" > 353< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN354" > 354< / td > < td class = "line" > < span class = 'comment' > // grow the array< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN355" > 355< / td > < td class = "line" > RJ_ASSERT(in.m_length + 1 < = c_BigInt_MaxBlocks);< / td > < / tr >
< tr > < td class = "num" id = "LN356" > 356< / td > < td class = "line" > *pResultCur = carry;< / td > < / tr >
< tr > < td class = "num" id = "LN357" > 357< / td > < td class = "line" > pResult-> m_length = in.m_length + 1;< / td > < / tr >
< tr > < td class = "num" id = "LN358" > 358< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN359" > 359< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN360" > 360< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN361" > 361< / td > < td class = "line" > pResult-> m_length = in.m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN362" > 362< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN363" > 363< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN364" > 364< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN365" > 365< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN366" > 366< / td > < td class = "line" > < span class = 'comment' > // result = result * 2< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN367" > 367< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN368" > 368< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_Multiply2(tBigInt * pResult)< / td > < / tr >
< tr > < td class = "num" id = "LN369" > 369< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN370" > 370< / td > < td class = "line" > < span class = 'comment' > // shift all the blocks by one< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN371" > 371< / td > < td class = "line" > tU32 carry = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN372" > 372< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN373" > 373< / td > < td class = "line" > tU32 *pCur = pResult-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN374" > 374< / td > < td class = "line" > tU32 *pEnd = pResult-> m_blocks + pResult-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN375" > 375< / td > < td class = "line" > < span class = 'keyword' > for< / span > ( ; pCur != pEnd; ++pCur )< / td > < / tr >
< tr > < td class = "num" id = "LN376" > 376< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN377" > 377< / td > < td class = "line" > tU32 cur = *pCur;< / td > < / tr >
< tr > < td class = "num" id = "LN378" > 378< / td > < td class = "line" > *pCur = (cur < < 1) | carry;< / td > < / tr >
< tr > < td class = "num" id = "LN379" > 379< / td > < td class = "line" > carry = cur > > 31;< / td > < / tr >
< tr > < td class = "num" id = "LN380" > 380< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN381" > 381< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN382" > 382< / td > < td class = "line" > < span class = 'keyword' > if< / span > (carry != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN383" > 383< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN384" > 384< / td > < td class = "line" > < span class = 'comment' > // grow the array< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN385" > 385< / td > < td class = "line" > RJ_ASSERT(pResult-> m_length + 1 < = c_BigInt_MaxBlocks);< / td > < / tr >
< tr > < td class = "num" id = "LN386" > 386< / td > < td class = "line" > *pCur = carry;< / td > < / tr >
< tr > < td class = "num" id = "LN387" > 387< / td > < td class = "line" > ++pResult-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN388" > 388< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN389" > 389< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN390" > 390< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN391" > 391< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN392" > 392< / td > < td class = "line" > < span class = 'comment' > // result = result * 10< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN393" > 393< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN394" > 394< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_Multiply10(tBigInt * pResult)< / td > < / tr >
< tr > < td class = "num" id = "LN395" > 395< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN396" > 396< / td > < td class = "line" > < span class = 'comment' > // multiply all the blocks< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN397" > 397< / td > < td class = "line" > tU64 carry = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN398" > 398< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN399" > 399< / td > < td class = "line" > tU32 *pCur = pResult-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN400" > 400< / td > < td class = "line" > tU32 *pEnd = pResult-> m_blocks + pResult-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN401" > 401< / td > < td class = "line" > < span class = 'keyword' > for< / span > ( ; pCur != pEnd; ++pCur )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path14" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 14< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path13" title = "Previous event (13)" > ← < / a > < / div > < / td > < / td > < td > Loop condition is false. Execution continues on line 408< / td > < td > < div class = "PathNav" > < a href = "#Path15" title = "Next event (15)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN402" > 402< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN403" > 403< / td > < td class = "line" > tU64 product = (tU64)(*pCur) * 10ull + carry;< / td > < / tr >
< tr > < td class = "num" id = "LN404" > 404< / td > < td class = "line" > (*pCur) = (tU32)(product & 0xFFFFFFFF);< / td > < / tr >
< tr > < td class = "num" id = "LN405" > 405< / td > < td class = "line" > carry = product > > 32;< / td > < / tr >
< tr > < td class = "num" id = "LN406" > 406< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN407" > 407< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN408" > 408< / td > < td class = "line" > < span class = 'keyword' > if< / span > (carry != 0)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path15" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 15< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path14" title = "Previous event (14)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path16" title = "Next event (16)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN409" > 409< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN410" > 410< / td > < td class = "line" > < span class = 'comment' > // grow the array< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN411" > 411< / td > < td class = "line" > RJ_ASSERT(pResult-> m_length + 1 < = c_BigInt_MaxBlocks);< / td > < / tr >
< tr > < td class = "num" id = "LN412" > 412< / td > < td class = "line" > *pCur = (tU32)carry;< / td > < / tr >
< tr > < td class = "num" id = "LN413" > 413< / td > < td class = "line" > ++pResult-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN414" > 414< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN415" > 415< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN416" > 416< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN417" > 417< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN418" > 418< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN419" > 419< / td > < td class = "line" > < span class = 'keyword' > static< / span > tU32 g_PowerOf10_U32[] =< / td > < / tr >
< tr > < td class = "num" id = "LN420" > 420< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN421" > 421< / td > < td class = "line" > 1, < span class = 'comment' > // 10 ^ 0< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN422" > 422< / td > < td class = "line" > 10, < span class = 'comment' > // 10 ^ 1< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN423" > 423< / td > < td class = "line" > 100, < span class = 'comment' > // 10 ^ 2< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN424" > 424< / td > < td class = "line" > 1000, < span class = 'comment' > // 10 ^ 3< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN425" > 425< / td > < td class = "line" > 10000, < span class = 'comment' > // 10 ^ 4< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN426" > 426< / td > < td class = "line" > 100000, < span class = 'comment' > // 10 ^ 5< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN427" > 427< / td > < td class = "line" > 1000000, < span class = 'comment' > // 10 ^ 6< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN428" > 428< / td > < td class = "line" > 10000000, < span class = 'comment' > // 10 ^ 7< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN429" > 429< / td > < td class = "line" > };< / td > < / tr >
< tr > < td class = "num" id = "LN430" > 430< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN431" > 431< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN432" > 432< / td > < td class = "line" > < span class = 'comment' > // Note: This has a lot of wasted space in the big integer structures of the< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN433" > 433< / td > < td class = "line" > < span class = 'comment' > // early table entries. It wouldn't be terribly hard to make the multiply< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN434" > 434< / td > < td class = "line" > < span class = 'comment' > // function work on integer pointers with an array length instead of< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN435" > 435< / td > < td class = "line" > < span class = 'comment' > // the tBigInt struct which would allow us to store a minimal amount of< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN436" > 436< / td > < td class = "line" > < span class = 'comment' > // data here.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN437" > 437< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN438" > 438< / td > < td class = "line" > < span class = 'keyword' > static< / span > tBigInt g_PowerOf10_Big[] =< / td > < / tr >
< tr > < td class = "num" id = "LN439" > 439< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN440" > 440< / td > < td class = "line" > < span class = 'comment' > // 10 ^ 8< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN441" > 441< / td > < td class = "line" > { 1, { 100000000 } },< / td > < / tr >
< tr > < td class = "num" id = "LN442" > 442< / td > < td class = "line" > < span class = 'comment' > // 10 ^ 16< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN443" > 443< / td > < td class = "line" > { 2, { 0x6fc10000, 0x002386f2 } },< / td > < / tr >
< tr > < td class = "num" id = "LN444" > 444< / td > < td class = "line" > < span class = 'comment' > // 10 ^ 32< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN445" > 445< / td > < td class = "line" > { 4, { 0x00000000, 0x85acef81, 0x2d6d415b, 0x000004ee, } },< / td > < / tr >
< tr > < td class = "num" id = "LN446" > 446< / td > < td class = "line" > < span class = 'comment' > // 10 ^ 64< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN447" > 447< / td > < td class = "line" > { 7, { 0x00000000, 0x00000000, 0xbf6a1f01, 0x6e38ed64, 0xdaa797ed, 0xe93ff9f4, 0x00184f03, } },< / td > < / tr >
< tr > < td class = "num" id = "LN448" > 448< / td > < td class = "line" > < span class = 'comment' > // 10 ^ 128< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN449" > 449< / td > < td class = "line" > { 14, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x2e953e01, 0x03df9909, 0x0f1538fd,< / td > < / tr >
< tr > < td class = "num" id = "LN450" > 450< / td > < td class = "line" > 0x2374e42f, 0xd3cff5ec, 0xc404dc08, 0xbccdb0da, 0xa6337f19, 0xe91f2603, 0x0000024e,< / td > < / tr >
< tr > < td class = "num" id = "LN451" > 451< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN452" > 452< / td > < td class = "line" > },< / td > < / tr >
< tr > < td class = "num" id = "LN453" > 453< / td > < td class = "line" > < span class = 'comment' > // 10 ^ 256< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN454" > 454< / td > < td class = "line" > { 27, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,< / td > < / tr >
< tr > < td class = "num" id = "LN455" > 455< / td > < td class = "line" > 0x00000000, 0x982e7c01, 0xbed3875b, 0xd8d99f72, 0x12152f87, 0x6bde50c6, 0xcf4a6e70,< / td > < / tr >
< tr > < td class = "num" id = "LN456" > 456< / td > < td class = "line" > 0xd595d80f, 0x26b2716e, 0xadc666b0, 0x1d153624, 0x3c42d35a, 0x63ff540e, 0xcc5573c0,< / td > < / tr >
< tr > < td class = "num" id = "LN457" > 457< / td > < td class = "line" > 0x65f9ef17, 0x55bc28f2, 0x80dcc7f7, 0xf46eeddc, 0x5fdcefce, 0x000553f7,< / td > < / tr >
< tr > < td class = "num" id = "LN458" > 458< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN459" > 459< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN460" > 460< / td > < td class = "line" > };< / td > < / tr >
< tr > < td class = "num" id = "LN461" > 461< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN462" > 462< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN463" > 463< / td > < td class = "line" > < span class = 'comment' > // result = 10^exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN464" > 464< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN465" > 465< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_Pow10(tBigInt * pResult, tU32 exponent)< / td > < / tr >
< tr > < td class = "num" id = "LN466" > 466< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN467" > 467< / td > < td class = "line" > < span class = 'comment' > // make sure the exponent is within the bounds of the lookup table data< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN468" > 468< / td > < td class = "line" > RJ_ASSERT(exponent < 512);< / td > < / tr >
< tr > < td class = "num" id = "LN469" > 469< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN470" > 470< / td > < td class = "line" > < span class = 'comment' > // create two temporary values to reduce large integer copy operations< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN471" > 471< / td > < td class = "line" > tBigInt temp1;< / td > < / tr >
< tr > < td class = "num" id = "LN472" > 472< / td > < td class = "line" > tBigInt temp2;< / td > < / tr >
< tr > < td class = "num" id = "LN473" > 473< / td > < td class = "line" > tBigInt *pCurTemp = & temp1;< / td > < / tr >
< tr > < td class = "num" id = "LN474" > 474< / td > < td class = "line" > tBigInt *pNextTemp = & temp2;< / td > < / tr >
< tr > < td class = "num" id = "LN475" > 475< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN476" > 476< / td > < td class = "line" > < span class = 'comment' > // initialize the result by looking up a 32-bit power of 10 corresponding to the first 3 bits< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN477" > 477< / td > < td class = "line" > tU32 smallExponent = exponent & 0x7;< / td > < / tr >
< tr > < td class = "num" id = "LN478" > 478< / td > < td class = "line" > pCurTemp-> SetU32(g_PowerOf10_U32[smallExponent]);< / td > < / tr >
< tr > < td class = "num" id = "LN479" > 479< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN480" > 480< / td > < td class = "line" > < span class = 'comment' > // remove the low bits that we used for the 32-bit lookup table< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN481" > 481< / td > < td class = "line" > exponent > > = 3;< / td > < / tr >
< tr > < td class = "num" id = "LN482" > 482< / td > < td class = "line" > tU32 tableIdx = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN483" > 483< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN484" > 484< / td > < td class = "line" > < span class = 'comment' > // while there are remaining bits in the exponent to be processed< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN485" > 485< / td > < td class = "line" > < span class = 'keyword' > while< / span > (exponent != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN486" > 486< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN487" > 487< / td > < td class = "line" > < span class = 'comment' > // if the current bit is set, multiply it with the corresponding power of 10< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN488" > 488< / td > < td class = "line" > < span class = 'keyword' > if< / span > (exponent & 1)< / td > < / tr >
< tr > < td class = "num" id = "LN489" > 489< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN490" > 490< / td > < td class = "line" > < span class = 'comment' > // multiply into the next temporary< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN491" > 491< / td > < td class = "line" > BigInt_Multiply( pNextTemp, *pCurTemp, g_PowerOf10_Big[tableIdx] );< / td > < / tr >
< tr > < td class = "num" id = "LN492" > 492< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN493" > 493< / td > < td class = "line" > < span class = 'comment' > // swap to the next temporary< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN494" > 494< / td > < td class = "line" > tBigInt * pSwap = pCurTemp;< / td > < / tr >
< tr > < td class = "num" id = "LN495" > 495< / td > < td class = "line" > pCurTemp = pNextTemp;< / td > < / tr >
< tr > < td class = "num" id = "LN496" > 496< / td > < td class = "line" > pNextTemp = pSwap;< / td > < / tr >
< tr > < td class = "num" id = "LN497" > 497< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN498" > 498< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN499" > 499< / td > < td class = "line" > < span class = 'comment' > // advance to the next bit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN500" > 500< / td > < td class = "line" > ++tableIdx;< / td > < / tr >
< tr > < td class = "num" id = "LN501" > 501< / td > < td class = "line" > exponent > > = 1;< / td > < / tr >
< tr > < td class = "num" id = "LN502" > 502< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN503" > 503< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN504" > 504< / td > < td class = "line" > < span class = 'comment' > // output the result< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN505" > 505< / td > < td class = "line" > *pResult = *pCurTemp;< / td > < / tr >
< tr > < td class = "num" id = "LN506" > 506< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN507" > 507< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN508" > 508< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN509" > 509< / td > < td class = "line" > < span class = 'comment' > // result = in * 10^exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN510" > 510< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN511" > 511< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_MultiplyPow10(tBigInt * pResult, < span class = 'keyword' > const< / span > tBigInt & in, tU32 exponent)< / td > < / tr >
< tr > < td class = "num" id = "LN512" > 512< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN513" > 513< / td > < td class = "line" > < span class = 'comment' > // make sure the exponent is within the bounds of the lookup table data< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN514" > 514< / td > < td class = "line" > RJ_ASSERT(exponent < 512);< / td > < / tr >
< tr > < td class = "num" id = "LN515" > 515< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN516" > 516< / td > < td class = "line" > < span class = 'comment' > // create two temporary values to reduce large integer copy operations< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN517" > 517< / td > < td class = "line" > tBigInt temp1;< / td > < / tr >
< tr > < td class = "num" id = "LN518" > 518< / td > < td class = "line" > tBigInt temp2;< / td > < / tr >
< tr > < td class = "num" id = "LN519" > 519< / td > < td class = "line" > tBigInt *pCurTemp = & temp1;< / td > < / tr >
< tr > < td class = "num" id = "LN520" > 520< / td > < td class = "line" > tBigInt *pNextTemp = & temp2;< / td > < / tr >
< tr > < td class = "num" id = "LN521" > 521< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN522" > 522< / td > < td class = "line" > < span class = 'comment' > // initialize the result by looking up a 32-bit power of 10 corresponding to the first 3 bits< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN523" > 523< / td > < td class = "line" > tU32 smallExponent = exponent & 0x7;< / td > < / tr >
< tr > < td class = "num" id = "LN524" > 524< / td > < td class = "line" > < span class = 'keyword' > if< / span > (smallExponent != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN525" > 525< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN526" > 526< / td > < td class = "line" > BigInt_Multiply( pCurTemp, in, g_PowerOf10_U32[smallExponent] );< / td > < / tr >
< tr > < td class = "num" id = "LN527" > 527< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN528" > 528< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN529" > 529< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN530" > 530< / td > < td class = "line" > *pCurTemp = in;< / td > < / tr >
< tr > < td class = "num" id = "LN531" > 531< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN532" > 532< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN533" > 533< / td > < td class = "line" > < span class = 'comment' > // remove the low bits that we used for the 32-bit lookup table< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN534" > 534< / td > < td class = "line" > exponent > > = 3;< / td > < / tr >
< tr > < td class = "num" id = "LN535" > 535< / td > < td class = "line" > tU32 tableIdx = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN536" > 536< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN537" > 537< / td > < td class = "line" > < span class = 'comment' > // while there are remaining bits in the exponent to be processed< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN538" > 538< / td > < td class = "line" > < span class = 'keyword' > while< / span > (exponent != 0)< / td > < / tr >
< tr > < td class = "num" id = "LN539" > 539< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN540" > 540< / td > < td class = "line" > < span class = 'comment' > // if the current bit is set, multiply it with the corresponding power of 10< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN541" > 541< / td > < td class = "line" > < span class = 'keyword' > if< / span > (exponent & 1)< / td > < / tr >
< tr > < td class = "num" id = "LN542" > 542< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN543" > 543< / td > < td class = "line" > < span class = 'comment' > // multiply into the next temporary< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN544" > 544< / td > < td class = "line" > BigInt_Multiply( pNextTemp, *pCurTemp, g_PowerOf10_Big[tableIdx] );< / td > < / tr >
< tr > < td class = "num" id = "LN545" > 545< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN546" > 546< / td > < td class = "line" > < span class = 'comment' > // swap to the next temporary< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN547" > 547< / td > < td class = "line" > tBigInt * pSwap = pCurTemp;< / td > < / tr >
< tr > < td class = "num" id = "LN548" > 548< / td > < td class = "line" > pCurTemp = pNextTemp;< / td > < / tr >
< tr > < td class = "num" id = "LN549" > 549< / td > < td class = "line" > pNextTemp = pSwap;< / td > < / tr >
< tr > < td class = "num" id = "LN550" > 550< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN551" > 551< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN552" > 552< / td > < td class = "line" > < span class = 'comment' > // advance to the next bit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN553" > 553< / td > < td class = "line" > ++tableIdx;< / td > < / tr >
< tr > < td class = "num" id = "LN554" > 554< / td > < td class = "line" > exponent > > = 1;< / td > < / tr >
< tr > < td class = "num" id = "LN555" > 555< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN556" > 556< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN557" > 557< / td > < td class = "line" > < span class = 'comment' > // output the result< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN558" > 558< / td > < td class = "line" > *pResult = *pCurTemp;< / td > < / tr >
< tr > < td class = "num" id = "LN559" > 559< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN560" > 560< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN561" > 561< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN562" > 562< / td > < td class = "line" > < span class = 'comment' > // result = 2^exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN563" > 563< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN564" > 564< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > inline< / span > < span class = 'keyword' > void< / span > BigInt_Pow2(tBigInt * pResult, tU32 exponent)< / td > < / tr >
< tr > < td class = "num" id = "LN565" > 565< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN566" > 566< / td > < td class = "line" > tU32 blockIdx = exponent / 32;< / td > < / tr >
< tr > < td class = "num" id = "LN567" > 567< / td > < td class = "line" > RJ_ASSERT( blockIdx < c_BigInt_MaxBlocks );< / td > < / tr >
< tr > < td class = "num" id = "LN568" > 568< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN569" > 569< / td > < td class = "line" > < span class = 'keyword' > for< / span > ( tU32 i = 0; i < = blockIdx; ++i)< / td > < / tr >
< tr > < td class = "num" id = "LN570" > 570< / td > < td class = "line" > pResult-> m_blocks[i] = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN571" > 571< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN572" > 572< / td > < td class = "line" > pResult-> m_length = blockIdx + 1;< / td > < / tr >
< tr > < td class = "num" id = "LN573" > 573< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN574" > 574< / td > < td class = "line" > tU32 bitIdx = (exponent % 32);< / td > < / tr >
< tr > < td class = "num" id = "LN575" > 575< / td > < td class = "line" > pResult-> m_blocks[blockIdx] |= (1 < < bitIdx);< / td > < / tr >
< tr > < td class = "num" id = "LN576" > 576< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN577" > 577< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN578" > 578< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN579" > 579< / td > < td class = "line" > < span class = 'comment' > // This function will divide two large numbers under the assumption that the< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN580" > 580< / td > < td class = "line" > < span class = 'comment' > // result is within the range [0,10) and the input numbers have been shifted< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN581" > 581< / td > < td class = "line" > < span class = 'comment' > // to satisfy:< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN582" > 582< / td > < td class = "line" > < span class = 'comment' > // - The highest block of the divisor is greater than or equal to 8 such that< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN583" > 583< / td > < td class = "line" > < span class = 'comment' > // there is enough precision to make an accurate first guess at the quotient.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN584" > 584< / td > < td class = "line" > < span class = 'comment' > // - The highest block of the divisor is less than the maximum value on an< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN585" > 585< / td > < td class = "line" > < span class = 'comment' > // unsigned 32-bit integer such that we can safely increment without overflow.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN586" > 586< / td > < td class = "line" > < span class = 'comment' > // - The dividend does not contain more blocks than the divisor such that we< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN587" > 587< / td > < td class = "line" > < span class = 'comment' > // can estimate the quotient by dividing the equivalently placed high blocks.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN588" > 588< / td > < td class = "line" > < span class = 'comment' > //< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN589" > 589< / td > < td class = "line" > < span class = 'comment' > // quotient = floor(dividend / divisor)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN590" > 590< / td > < td class = "line" > < span class = 'comment' > // remainder = dividend - quotient*divisor< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN591" > 591< / td > < td class = "line" > < span class = 'comment' > //< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN592" > 592< / td > < td class = "line" > < span class = 'comment' > // pDividend is updated to be the remainder and the quotient is returned.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN593" > 593< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN594" > 594< / td > < td class = "line" > < span class = 'keyword' > static< / span > tU32 BigInt_DivideWithRemainder_MaxQuotient9(tBigInt * pDividend, < span class = 'keyword' > const< / span > tBigInt & divisor)< / td > < / tr >
< tr > < td class = "num" id = "LN595" > 595< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN596" > 596< / td > < td class = "line" > < span class = 'comment' > // Check that the divisor has been correctly shifted into range and that it is not< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN597" > 597< / td > < td class = "line" > < span class = 'comment' > // smaller than the dividend in length.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN598" > 598< / td > < td class = "line" > RJ_ASSERT( !divisor.IsZero() & & < / td > < / tr >
< tr > < td class = "num" id = "LN599" > 599< / td > < td class = "line" > divisor.m_blocks[divisor.m_length-1] > = 8 & & < / td > < / tr >
< tr > < td class = "num" id = "LN600" > 600< / td > < td class = "line" > divisor.m_blocks[divisor.m_length-1] < 0xFFFFFFFF & & < / td > < / tr >
< tr > < td class = "num" id = "LN601" > 601< / td > < td class = "line" > pDividend-> m_length < = divisor.m_length );< / td > < / tr >
< tr > < td class = "num" id = "LN602" > 602< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN603" > 603< / td > < td class = "line" > < span class = 'comment' > // If the dividend is smaller than the divisor, the quotient is zero and the divisor is already< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN604" > 604< / td > < td class = "line" > < span class = 'comment' > // the remainder.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN605" > 605< / td > < td class = "line" > tU32 length = divisor.m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN606" > 606< / td > < td class = "line" > < span class = 'keyword' > if< / span > (pDividend-> m_length < divisor.m_length)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path34" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 34< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path33" title = "Previous event (33)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path35" title = "Next event (35)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN607" > 607< / td > < td class = "line" > < span class = 'keyword' > return< / span > 0;< / td > < / tr >
< tr > < td class = "num" id = "LN608" > 608< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN609" > 609< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 * pFinalDivisorBlock = divisor.m_blocks + length - 1;< / td > < / tr >
< tr > < td class = "num" id = "LN610" > 610< / td > < td class = "line" > tU32 * pFinalDividendBlock = pDividend-> m_blocks + length - 1;< / td > < / tr >
< tr > < td class = "num" id = "LN611" > 611< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN612" > 612< / td > < td class = "line" > < span class = 'comment' > // Compute an estimated quotient based on the high block value. This will either match the actual quotient or< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN613" > 613< / td > < td class = "line" > < span class = 'comment' > // undershoot by one.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN614" > 614< / td > < td class = "line" > tU32 quotient = *pFinalDividendBlock / (*pFinalDivisorBlock + 1);< / td > < / tr >
< tr > < td class = "num" id = "LN615" > 615< / td > < td class = "line" > RJ_ASSERT(quotient < = 9);< / td > < / tr >
< tr > < td class = "num" id = "LN616" > 616< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN617" > 617< / td > < td class = "line" > < span class = 'comment' > // Divide out the estimated quotient< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN618" > 618< / td > < td class = "line" > < span class = 'keyword' > if< / span > (< span class = "mrange" > quotient != 0< / span > )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path35" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 35< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path34" title = "Previous event (34)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'quotient' is not equal to 0< / td > < td > < div class = "PathNav" > < a href = "#Path36" title = "Next event (36)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path36" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 36< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path35" title = "Previous event (35)" > ← < / a > < / div > < / td > < / td > < td > Taking true branch< / td > < td > < div class = "PathNav" > < a href = "#Path37" title = "Next event (37)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN619" > 619< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN620" > 620< / td > < td class = "line" > < span class = 'comment' > // dividend = dividend - divisor*quotient< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN621" > 621< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pDivisorCur = divisor.m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN622" > 622< / td > < td class = "line" > tU32 *pDividendCur = pDividend-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN623" > 623< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN624" > 624< / td > < td class = "line" > tU64 borrow = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN625" > 625< / td > < td class = "line" > tU64 carry = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN626" > 626< / td > < td class = "line" > < span class = 'keyword' > do< / span > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path37" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 37< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path36" title = "Previous event (36)" > ← < / a > < / div > < / td > < / td > < td > Loop condition is true. Execution continues on line 628< / td > < td > < div class = "PathNav" > < a href = "#EndPath" title = "Next event (38)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN627" > 627< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN628" > 628< / td > < td class = "line" > tU64 product = (tU64)*pDivisorCur * (tU64)quotient + carry;< / td > < / tr >
< tr > < td class = "num" id = "LN629" > 629< / td > < td class = "line" > carry = product > > 32;< / td > < / tr >
< tr > < td class = "num" id = "LN630" > 630< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN631" > 631< / td > < td class = "line" > tU64 difference = (tU64)< span class = "mrange" > *pDividendCur< / span > - (product & 0xFFFFFFFF) - borrow;< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "EndPath" class = "msg msgEvent" style = "margin-left:51ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 38< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path37" title = "Previous event (37)" > ← < / a > < / div > < / td > < / td > < td > The left operand of '-' is a garbage value< / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN632" > 632< / td > < td class = "line" > borrow = (difference > > 32) & 1;< / td > < / tr >
< tr > < td class = "num" id = "LN633" > 633< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN634" > 634< / td > < td class = "line" > *pDividendCur = difference & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN635" > 635< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN636" > 636< / td > < td class = "line" > ++pDivisorCur;< / td > < / tr >
< tr > < td class = "num" id = "LN637" > 637< / td > < td class = "line" > ++pDividendCur;< / td > < / tr >
< tr > < td class = "num" id = "LN638" > 638< / td > < td class = "line" > } < span class = 'keyword' > while< / span > (pDivisorCur < = pFinalDivisorBlock);< / td > < / tr >
< tr > < td class = "num" id = "LN639" > 639< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN640" > 640< / td > < td class = "line" > < span class = 'comment' > // remove all leading zero blocks from dividend< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN641" > 641< / td > < td class = "line" > < span class = 'keyword' > while< / span > (length > 0 & & pDividend-> m_blocks[length - 1] == 0)< / td > < / tr >
< tr > < td class = "num" id = "LN642" > 642< / td > < td class = "line" > --length;< / td > < / tr >
< tr > < td class = "num" id = "LN643" > 643< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN644" > 644< / td > < td class = "line" > pDividend-> m_length = length;< / td > < / tr >
< tr > < td class = "num" id = "LN645" > 645< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN646" > 646< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN647" > 647< / td > < td class = "line" > < span class = 'comment' > // If the dividend is still larger than the divisor, we overshot our estimate quotient. To correct,< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN648" > 648< / td > < td class = "line" > < span class = 'comment' > // we increment the quotient and subtract one more divisor from the dividend.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN649" > 649< / td > < td class = "line" > < span class = 'keyword' > if< / span > ( BigInt_Compare(*pDividend, divisor) > = 0 )< / td > < / tr >
< tr > < td class = "num" id = "LN650" > 650< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN651" > 651< / td > < td class = "line" > ++quotient;< / td > < / tr >
< tr > < td class = "num" id = "LN652" > 652< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN653" > 653< / td > < td class = "line" > < span class = 'comment' > // dividend = dividend - divisor< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN654" > 654< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 *pDivisorCur = divisor.m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN655" > 655< / td > < td class = "line" > tU32 *pDividendCur = pDividend-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN656" > 656< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN657" > 657< / td > < td class = "line" > tU64 borrow = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN658" > 658< / td > < td class = "line" > < span class = 'keyword' > do< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN659" > 659< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN660" > 660< / td > < td class = "line" > tU64 difference = (tU64)*pDividendCur - (tU64)*pDivisorCur - borrow;< / td > < / tr >
< tr > < td class = "num" id = "LN661" > 661< / td > < td class = "line" > borrow = (difference > > 32) & 1;< / td > < / tr >
< tr > < td class = "num" id = "LN662" > 662< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN663" > 663< / td > < td class = "line" > *pDividendCur = difference & 0xFFFFFFFF;< / td > < / tr >
< tr > < td class = "num" id = "LN664" > 664< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN665" > 665< / td > < td class = "line" > ++pDivisorCur;< / td > < / tr >
< tr > < td class = "num" id = "LN666" > 666< / td > < td class = "line" > ++pDividendCur;< / td > < / tr >
< tr > < td class = "num" id = "LN667" > 667< / td > < td class = "line" > } < span class = 'keyword' > while< / span > (pDivisorCur < = pFinalDivisorBlock);< / td > < / tr >
< tr > < td class = "num" id = "LN668" > 668< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN669" > 669< / td > < td class = "line" > < span class = 'comment' > // remove all leading zero blocks from dividend< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN670" > 670< / td > < td class = "line" > < span class = 'keyword' > while< / span > (length > 0 & & pDividend-> m_blocks[length - 1] == 0)< / td > < / tr >
< tr > < td class = "num" id = "LN671" > 671< / td > < td class = "line" > --length;< / td > < / tr >
< tr > < td class = "num" id = "LN672" > 672< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN673" > 673< / td > < td class = "line" > pDividend-> m_length = length;< / td > < / tr >
< tr > < td class = "num" id = "LN674" > 674< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN675" > 675< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN676" > 676< / td > < td class = "line" > < span class = 'keyword' > return< / span > quotient;< / td > < / tr >
< tr > < td class = "num" id = "LN677" > 677< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN678" > 678< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN679" > 679< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN680" > 680< / td > < td class = "line" > < span class = 'comment' > // result = result < < shift< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN681" > 681< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN682" > 682< / td > < td class = "line" > < span class = 'keyword' > static< / span > < span class = 'keyword' > void< / span > BigInt_ShiftLeft(tBigInt * pResult, tU32 shift)< / td > < / tr >
< tr > < td class = "num" id = "LN683" > 683< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN684" > 684< / td > < td class = "line" > RJ_ASSERT( shift != 0 );< / td > < / tr >
< tr > < td class = "num" id = "LN685" > 685< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN686" > 686< / td > < td class = "line" > tU32 shiftBlocks = shift / 32;< / td > < / tr >
< tr > < td class = "num" id = "LN687" > 687< / td > < td class = "line" > tU32 shiftBits = shift % 32;< / td > < / tr >
< tr > < td class = "num" id = "LN688" > 688< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN689" > 689< / td > < td class = "line" > < span class = 'comment' > // process blocks high to low so that we can safely process in place< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN690" > 690< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 * pInBlocks = pResult-> m_blocks;< / td > < / tr >
< tr > < td class = "num" id = "LN691" > 691< / td > < td class = "line" > tS32 inLength = pResult-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN692" > 692< / td > < td class = "line" > RJ_ASSERT( inLength + shiftBlocks < c_BigInt_MaxBlocks );< / td > < / tr >
< tr > < td class = "num" id = "LN693" > 693< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN694" > 694< / td > < td class = "line" > < span class = 'comment' > // check if the shift is block aligned< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN695" > 695< / td > < td class = "line" > < span class = 'keyword' > if< / span > (shiftBits == 0)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path25" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 25< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path24" title = "Previous event (24)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path26" title = "Next event (26)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN696" > 696< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN697" > 697< / td > < td class = "line" > < span class = 'comment' > // copy blcoks from high to low< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN698" > 698< / td > < td class = "line" > < span class = 'keyword' > for< / span > (tU32 * pInCur = pResult-> m_blocks + inLength, *pOutCur = pInCur + shiftBlocks;< / td > < / tr >
< tr > < td class = "num" id = "LN699" > 699< / td > < td class = "line" > pInCur > = pInBlocks;< / td > < / tr >
< tr > < td class = "num" id = "LN700" > 700< / td > < td class = "line" > --pInCur, --pOutCur)< / td > < / tr >
< tr > < td class = "num" id = "LN701" > 701< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN702" > 702< / td > < td class = "line" > *pOutCur = *pInCur;< / td > < / tr >
< tr > < td class = "num" id = "LN703" > 703< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN704" > 704< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN705" > 705< / td > < td class = "line" > < span class = 'comment' > // zero the remaining low blocks< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN706" > 706< / td > < td class = "line" > < span class = 'keyword' > for< / span > ( tU32 i = 0; i < shiftBlocks; ++i)< / td > < / tr >
< tr > < td class = "num" id = "LN707" > 707< / td > < td class = "line" > pResult-> m_blocks[i] = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN708" > 708< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN709" > 709< / td > < td class = "line" > pResult-> m_length += shiftBlocks;< / td > < / tr >
< tr > < td class = "num" id = "LN710" > 710< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN711" > 711< / td > < td class = "line" > < span class = 'comment' > // else we need to shift partial blocks< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN712" > 712< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN713" > 713< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN714" > 714< / td > < td class = "line" > tS32 inBlockIdx = inLength - 1;< / td > < / tr >
< tr > < td class = "num" id = "LN715" > 715< / td > < td class = "line" > tU32 outBlockIdx = inLength + shiftBlocks;< / td > < / tr >
< tr > < td class = "num" id = "LN716" > 716< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN717" > 717< / td > < td class = "line" > < span class = 'comment' > // set the length to hold the shifted blocks< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN718" > 718< / td > < td class = "line" > RJ_ASSERT( outBlockIdx < c_BigInt_MaxBlocks );< / td > < / tr >
< tr > < td class = "num" id = "LN719" > 719< / td > < td class = "line" > pResult-> m_length = outBlockIdx + 1;< / td > < / tr >
< tr > < td class = "num" id = "LN720" > 720< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN721" > 721< / td > < td class = "line" > < span class = 'comment' > // output the initial blocks< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN722" > 722< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 lowBitsShift = (32 - shiftBits);< / td > < / tr >
< tr > < td class = "num" id = "LN723" > 723< / td > < td class = "line" > tU32 highBits = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN724" > 724< / td > < td class = "line" > tU32 block = pResult-> m_blocks[inBlockIdx];< / td > < / tr >
< tr > < td class = "num" id = "LN725" > 725< / td > < td class = "line" > tU32 lowBits = block > > lowBitsShift;< / td > < / tr >
< tr > < td class = "num" id = "LN726" > 726< / td > < td class = "line" > < span class = 'keyword' > while< / span > ( inBlockIdx > 0 )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path26" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 26< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path25" title = "Previous event (25)" > ← < / a > < / div > < / td > < / td > < td > Loop condition is false. Execution continues on line 740< / td > < td > < div class = "PathNav" > < a href = "#Path27" title = "Next event (27)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN727" > 727< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN728" > 728< / td > < td class = "line" > pResult-> m_blocks[outBlockIdx] = highBits | lowBits;< / td > < / tr >
< tr > < td class = "num" id = "LN729" > 729< / td > < td class = "line" > highBits = block < < shiftBits;< / td > < / tr >
< tr > < td class = "num" id = "LN730" > 730< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN731" > 731< / td > < td class = "line" > --inBlockIdx;< / td > < / tr >
< tr > < td class = "num" id = "LN732" > 732< / td > < td class = "line" > --outBlockIdx;< / td > < / tr >
< tr > < td class = "num" id = "LN733" > 733< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN734" > 734< / td > < td class = "line" > block = pResult-> m_blocks[inBlockIdx];< / td > < / tr >
< tr > < td class = "num" id = "LN735" > 735< / td > < td class = "line" > lowBits = block > > lowBitsShift;< / td > < / tr >
< tr > < td class = "num" id = "LN736" > 736< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN737" > 737< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN738" > 738< / td > < td class = "line" > < span class = 'comment' > // output the final blocks< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN739" > 739< / td > < td class = "line" > RJ_ASSERT( outBlockIdx == shiftBlocks + 1 );< / td > < / tr >
< tr > < td class = "num" id = "LN740" > 740< / td > < td class = "line" > pResult-> m_blocks[outBlockIdx] = highBits | lowBits;< / td > < / tr >
< tr > < td class = "num" id = "LN741" > 741< / td > < td class = "line" > pResult-> m_blocks[outBlockIdx-1] = block < < shiftBits;< / td > < / tr >
< tr > < td class = "num" id = "LN742" > 742< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN743" > 743< / td > < td class = "line" > < span class = 'comment' > // zero the remaining low blocks< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN744" > 744< / td > < td class = "line" > < span class = 'keyword' > for< / span > ( tU32 i = 0; i < shiftBlocks; ++i)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path27" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 27< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path26" title = "Previous event (26)" > ← < / a > < / div > < / td > < / td > < td > Loop condition is false. Execution continues on line 748< / td > < td > < div class = "PathNav" > < a href = "#Path28" title = "Next event (28)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN745" > 745< / td > < td class = "line" > pResult-> m_blocks[i] = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN746" > 746< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN747" > 747< / td > < td class = "line" > < span class = 'comment' > // check if the terminating block has no set bits< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN748" > 748< / td > < td class = "line" > < span class = 'keyword' > if< / span > (pResult-> m_blocks[pResult-> m_length - 1] == 0)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path28" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 28< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path27" title = "Previous event (27)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path29" title = "Next event (29)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN749" > 749< / td > < td class = "line" > --pResult-> m_length;< / td > < / tr >
< tr > < td class = "num" id = "LN750" > 750< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN751" > 751< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN752" > 752< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN753" > 753< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN754" > 754< / td > < td class = "line" > < span class = 'comment' > // This is an implementation the Dragon4 algorithm to convert a binary number< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN755" > 755< / td > < td class = "line" > < span class = 'comment' > // in floating point format to a decimal number in string format. The function< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN756" > 756< / td > < td class = "line" > < span class = 'comment' > // returns the number of digits written to the output buffer and the output is< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN757" > 757< / td > < td class = "line" > < span class = 'comment' > // not NUL terminated.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN758" > 758< / td > < td class = "line" > < span class = 'comment' > //< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN759" > 759< / td > < td class = "line" > < span class = 'comment' > // The floating point input value is (mantissa * 2^exponent).< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN760" > 760< / td > < td class = "line" > < span class = 'comment' > //< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN761" > 761< / td > < td class = "line" > < span class = 'comment' > // See the following papers for more information on the algorithm:< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN762" > 762< / td > < td class = "line" > < span class = 'comment' > // "How to Print Floating-Point Numbers Accurately"< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN763" > 763< / td > < td class = "line" > < span class = 'comment' > // Steele and White< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN764" > 764< / td > < td class = "line" > < span class = 'comment' > // http://kurtstephens.com/files/p372-steele.pdf< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN765" > 765< / td > < td class = "line" > < span class = 'comment' > // "Printing Floating-Point Numbers Quickly and Accurately"< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN766" > 766< / td > < td class = "line" > < span class = 'comment' > // Burger and Dybvig< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN767" > 767< / td > < td class = "line" > < span class = 'comment' > // http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.72.4656& rep=rep1& type=pdf< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN768" > 768< / td > < td class = "line" > < span class = 'comment' > //******************************************************************************< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN769" > 769< / td > < td class = "line" > tU32 Dragon4< / td > < / tr >
< tr > < td class = "num" id = "LN770" > 770< / td > < td class = "line" > (< / td > < / tr >
< tr > < td class = "num" id = "LN771" > 771< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU64 mantissa, < span class = 'comment' > // value significand< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN772" > 772< / td > < td class = "line" > < span class = 'keyword' > const< / span > tS32 exponent, < span class = 'comment' > // value exponent in base 2< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN773" > 773< / td > < td class = "line" > < span class = 'keyword' > const< / span > tU32 mantissaHighBitIdx, < span class = 'comment' > // index of the highest set mantissa bit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN774" > 774< / td > < td class = "line" > < span class = 'keyword' > const< / span > tB hasUnequalMargins, < span class = 'comment' > // is the high margin twice as large as the low margin< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN775" > 775< / td > < td class = "line" > < span class = 'keyword' > const< / span > tCutoffMode cutoffMode, < span class = 'comment' > // how to determine output length< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN776" > 776< / td > < td class = "line" > tU32 cutoffNumber, < span class = 'comment' > // parameter to the selected cutoffMode< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN777" > 777< / td > < td class = "line" > tC8 * pOutBuffer, < span class = 'comment' > // buffer to output into< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN778" > 778< / td > < td class = "line" > tU32 bufferSize, < span class = 'comment' > // maximum characters that can be printed to pOutBuffer< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN779" > 779< / td > < td class = "line" > tS32 * pOutExponent < span class = 'comment' > // the base 10 exponent of the first digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN780" > 780< / td > < td class = "line" > )< / td > < / tr >
< tr > < td class = "num" id = "LN781" > 781< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN782" > 782< / td > < td class = "line" > tC8 * pCurDigit = pOutBuffer;< / td > < / tr >
< tr > < td class = "num" id = "LN783" > 783< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN784" > 784< / td > < td class = "line" > RJ_ASSERT( bufferSize > 0 );< / td > < / tr >
< tr > < td class = "num" id = "LN785" > 785< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN786" > 786< / td > < td class = "line" > < span class = 'comment' > // if the mantissa is zero, the value is zero regardless of the exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN787" > 787< / td > < td class = "line" > < span class = 'keyword' > if< / span > (< span class = "mrange" > mantissa == 0< / span > )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path1" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 1< / div > < / td > < td > Assuming 'mantissa' is not equal to 0< / td > < td > < div class = "PathNav" > < a href = "#Path2" title = "Next event (2)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path2" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 2< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path1" title = "Previous event (1)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path3" title = "Next event (3)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN788" > 788< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN789" > 789< / td > < td class = "line" > *pCurDigit = '0';< / td > < / tr >
< tr > < td class = "num" id = "LN790" > 790< / td > < td class = "line" > *pOutExponent = 0;< / td > < / tr >
< tr > < td class = "num" id = "LN791" > 791< / td > < td class = "line" > < span class = 'keyword' > return< / span > 1;< / td > < / tr >
< tr > < td class = "num" id = "LN792" > 792< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN793" > 793< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN794" > 794< / td > < td class = "line" > < span class = 'comment' > // compute the initial state in integral form such that< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN795" > 795< / td > < td class = "line" > < span class = 'comment' > // value = scaledValue / scale< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN796" > 796< / td > < td class = "line" > < span class = 'comment' > // marginLow = scaledMarginLow / scale< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN797" > 797< / td > < td class = "line" > tBigInt scale; < span class = 'comment' > // positive scale applied to value and margin such that they can be< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN798" > 798< / td > < td class = "line" > < span class = 'comment' > // represented as whole numbers< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN799" > 799< / td > < td class = "line" > tBigInt scaledValue; < span class = 'comment' > // scale * mantissa< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN800" > 800< / td > < td class = "line" > tBigInt scaledMarginLow; < span class = 'comment' > // scale * 0.5 * (distance between this floating-point number and its< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN801" > 801< / td > < td class = "line" > < span class = 'comment' > // immediate lower value)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN802" > 802< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN803" > 803< / td > < td class = "line" > < span class = 'comment' > // For normalized IEEE floating point values, each time the exponent is incremented the margin also< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN804" > 804< / td > < td class = "line" > < span class = 'comment' > // doubles. That creates a subset of transition numbers where the high margin is twice the size of< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN805" > 805< / td > < td class = "line" > < span class = 'comment' > // the low margin.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN806" > 806< / td > < td class = "line" > tBigInt * pScaledMarginHigh;< / td > < / tr >
< tr > < td class = "num" id = "LN807" > 807< / td > < td class = "line" > tBigInt optionalMarginHigh;< / td > < / tr >
< tr > < td class = "num" id = "LN808" > 808< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN809" > 809< / td > < td class = "line" > < span class = 'keyword' > if< / span > ( < span class = "mrange" > hasUnequalMargins< / span > )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path3" class = "msg msgEvent" style = "margin-left:10ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 3< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path2" title = "Previous event (2)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'hasUnequalMargins' is 0< / td > < td > < div class = "PathNav" > < a href = "#Path4" title = "Next event (4)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path4" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 4< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path3" title = "Previous event (3)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path5" title = "Next event (5)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN810" > 810< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN811" > 811< / td > < td class = "line" > < span class = 'comment' > // if we have no fractional component< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN812" > 812< / td > < td class = "line" > < span class = 'keyword' > if< / span > (exponent > 0)< / td > < / tr >
< tr > < td class = "num" id = "LN813" > 813< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN814" > 814< / td > < td class = "line" > < span class = 'comment' > // 1) Expand the input value by multiplying out the mantissa and exponent. This represents< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN815" > 815< / td > < td class = "line" > < span class = 'comment' > // the input value in its whole number representation.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN816" > 816< / td > < td class = "line" > < span class = 'comment' > // 2) Apply an additional scale of 2 such that later comparisons against the margin values< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN817" > 817< / td > < td class = "line" > < span class = 'comment' > // are simplified.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN818" > 818< / td > < td class = "line" > < span class = 'comment' > // 3) Set the margin value to the lowest mantissa bit's scale.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN819" > 819< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN820" > 820< / td > < td class = "line" > < span class = 'comment' > // scaledValue = 2 * 2 * mantissa*2^exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN821" > 821< / td > < td class = "line" > scaledValue.SetU64( 4 * mantissa );< / td > < / tr >
< tr > < td class = "num" id = "LN822" > 822< / td > < td class = "line" > BigInt_ShiftLeft( & scaledValue, exponent );< / td > < / tr >
< tr > < td class = "num" id = "LN823" > 823< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN824" > 824< / td > < td class = "line" > < span class = 'comment' > // scale = 2 * 2 * 1< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN825" > 825< / td > < td class = "line" > scale.SetU32( 4 );< / td > < / tr >
< tr > < td class = "num" id = "LN826" > 826< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN827" > 827< / td > < td class = "line" > < span class = 'comment' > // scaledMarginLow = 2 * 2^(exponent-1)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN828" > 828< / td > < td class = "line" > BigInt_Pow2( & scaledMarginLow, exponent );< / td > < / tr >
< tr > < td class = "num" id = "LN829" > 829< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN830" > 830< / td > < td class = "line" > < span class = 'comment' > // scaledMarginHigh = 2 * 2 * 2^(exponent-1)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN831" > 831< / td > < td class = "line" > BigInt_Pow2( & optionalMarginHigh, exponent + 1 );< / td > < / tr >
< tr > < td class = "num" id = "LN832" > 832< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN833" > 833< / td > < td class = "line" > < span class = 'comment' > // else we have a fractional exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN834" > 834< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN835" > 835< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN836" > 836< / td > < td class = "line" > < span class = 'comment' > // In order to track the mantissa data as an integer, we store it as is with a large scale< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN837" > 837< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN838" > 838< / td > < td class = "line" > < span class = 'comment' > // scaledValue = 2 * 2 * mantissa< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN839" > 839< / td > < td class = "line" > scaledValue.SetU64( 4 * mantissa );< / td > < / tr >
< tr > < td class = "num" id = "LN840" > 840< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN841" > 841< / td > < td class = "line" > < span class = 'comment' > // scale = 2 * 2 * 2^(-exponent)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN842" > 842< / td > < td class = "line" > BigInt_Pow2(& scale, -exponent + 2 );< / td > < / tr >
< tr > < td class = "num" id = "LN843" > 843< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN844" > 844< / td > < td class = "line" > < span class = 'comment' > // scaledMarginLow = 2 * 2^(-1)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN845" > 845< / td > < td class = "line" > scaledMarginLow.SetU32( 1 );< / td > < / tr >
< tr > < td class = "num" id = "LN846" > 846< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN847" > 847< / td > < td class = "line" > < span class = 'comment' > // scaledMarginHigh = 2 * 2 * 2^(-1)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN848" > 848< / td > < td class = "line" > optionalMarginHigh.SetU32( 2 );< / td > < / tr >
< tr > < td class = "num" id = "LN849" > 849< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN850" > 850< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN851" > 851< / td > < td class = "line" > < span class = 'comment' > // the high and low margins are different< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN852" > 852< / td > < td class = "line" > pScaledMarginHigh = & optionalMarginHigh;< / td > < / tr >
< tr > < td class = "num" id = "LN853" > 853< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN854" > 854< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN855" > 855< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN856" > 856< / td > < td class = "line" > < span class = 'comment' > // if we have no fractional component< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN857" > 857< / td > < td class = "line" > < span class = 'keyword' > if< / span > (< span class = "mrange" > exponent > 0< / span > )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path5" class = "msg msgEvent" style = "margin-left:13ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 5< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path4" title = "Previous event (4)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'exponent' is < = 0< / td > < td > < div class = "PathNav" > < a href = "#Path6" title = "Next event (6)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path6" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 6< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path5" title = "Previous event (5)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path7" title = "Next event (7)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN858" > 858< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN859" > 859< / td > < td class = "line" > < span class = 'comment' > // 1) Expand the input value by multiplying out the mantissa and exponent. This represents< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN860" > 860< / td > < td class = "line" > < span class = 'comment' > // the input value in its whole number representation.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN861" > 861< / td > < td class = "line" > < span class = 'comment' > // 2) Apply an additional scale of 2 such that later comparisons against the margin values< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN862" > 862< / td > < td class = "line" > < span class = 'comment' > // are simplified.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN863" > 863< / td > < td class = "line" > < span class = 'comment' > // 3) Set the margin value to the lowest mantissa bit's scale.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN864" > 864< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN865" > 865< / td > < td class = "line" > < span class = 'comment' > // scaledValue = 2 * mantissa*2^exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN866" > 866< / td > < td class = "line" > scaledValue.SetU64( 2 * mantissa );< / td > < / tr >
< tr > < td class = "num" id = "LN867" > 867< / td > < td class = "line" > BigInt_ShiftLeft( & scaledValue, exponent );< / td > < / tr >
< tr > < td class = "num" id = "LN868" > 868< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN869" > 869< / td > < td class = "line" > < span class = 'comment' > // scale = 2 * 1< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN870" > 870< / td > < td class = "line" > scale.SetU32( 2 );< / td > < / tr >
< tr > < td class = "num" id = "LN871" > 871< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN872" > 872< / td > < td class = "line" > < span class = 'comment' > // scaledMarginLow = 2 * 2^(exponent-1)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN873" > 873< / td > < td class = "line" > BigInt_Pow2( & scaledMarginLow, exponent );< / td > < / tr >
< tr > < td class = "num" id = "LN874" > 874< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN875" > 875< / td > < td class = "line" > < span class = 'comment' > // else we have a fractional exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN876" > 876< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN877" > 877< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN878" > 878< / td > < td class = "line" > < span class = 'comment' > // In order to track the mantissa data as an integer, we store it as is with a large scale< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN879" > 879< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN880" > 880< / td > < td class = "line" > < span class = 'comment' > // scaledValue = 2 * mantissa< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN881" > 881< / td > < td class = "line" > scaledValue.SetU64( 2 * mantissa );< / td > < / tr >
< tr > < td class = "num" id = "LN882" > 882< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN883" > 883< / td > < td class = "line" > < span class = 'comment' > // scale = 2 * 2^(-exponent)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN884" > 884< / td > < td class = "line" > BigInt_Pow2(& scale, -exponent + 1 );< / td > < / tr >
< tr > < td class = "num" id = "LN885" > 885< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN886" > 886< / td > < td class = "line" > < span class = 'comment' > // scaledMarginLow = 2 * 2^(-1)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN887" > 887< / td > < td class = "line" > scaledMarginLow.SetU32( 1 );< / td > < / tr >
< tr > < td class = "num" id = "LN888" > 888< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN889" > 889< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN890" > 890< / td > < td class = "line" > < span class = 'comment' > // the high and low margins are equal< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN891" > 891< / td > < td class = "line" > pScaledMarginHigh = & scaledMarginLow;< / td > < / tr >
< tr > < td class = "num" id = "LN892" > 892< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN893" > 893< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN894" > 894< / td > < td class = "line" > < span class = 'comment' > // Compute an estimate for digitExponent that will be correct or undershoot by one.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN895" > 895< / td > < td class = "line" > < span class = 'comment' > // This optimization is based on the paper "Printing Floating-Point Numbers Quickly and Accurately"< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN896" > 896< / td > < td class = "line" > < span class = 'comment' > // by Burger and Dybvig http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.72.4656& rep=rep1& type=pdf< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN897" > 897< / td > < td class = "line" > < span class = 'comment' > // We perform an additional subtraction of 0.69 to increase the frequency of a failed estimate< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN898" > 898< / td > < td class = "line" > < span class = 'comment' > // because that lets us take a faster branch in the code. 0.69 is chosen because 0.69 + log10(2) is< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN899" > 899< / td > < td class = "line" > < span class = 'comment' > // less than one by a reasonable epsilon that will account for any floating point error.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN900" > 900< / td > < td class = "line" > < span class = 'comment' > //< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN901" > 901< / td > < td class = "line" > < span class = 'comment' > // We want to set digitExponent to floor(log10(v)) + 1< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN902" > 902< / td > < td class = "line" > < span class = 'comment' > // v = mantissa*2^exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN903" > 903< / td > < td class = "line" > < span class = 'comment' > // log2(v) = log2(mantissa) + exponent;< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN904" > 904< / td > < td class = "line" > < span class = 'comment' > // log10(v) = log2(v) * log10(2)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN905" > 905< / td > < td class = "line" > < span class = 'comment' > // floor(log2(v)) = mantissaHighBitIdx + exponent;< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN906" > 906< / td > < td class = "line" > < span class = 'comment' > // log10(v) - log10(2) < (mantissaHighBitIdx + exponent) * log10(2) < = log10(v)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN907" > 907< / td > < td class = "line" > < span class = 'comment' > // log10(v) < (mantissaHighBitIdx + exponent) * log10(2) + log10(2) < = log10(v) + log10(2)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN908" > 908< / td > < td class = "line" > < span class = 'comment' > // floor( log10(v) ) < ceil( (mantissaHighBitIdx + exponent) * log10(2) ) < = floor( log10(v) ) + 1< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN909" > 909< / td > < td class = "line" > < span class = 'keyword' > const< / span > tF64 log10_2 = 0.30102999566398119521373889472449;< / td > < / tr >
< tr > < td class = "num" id = "LN910" > 910< / td > < td class = "line" > tS32 digitExponent = (tS32)(ceil(tF64((tS32)mantissaHighBitIdx + exponent) * log10_2 - 0.69));< / td > < / tr >
< tr > < td class = "num" id = "LN911" > 911< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN912" > 912< / td > < td class = "line" > < span class = 'comment' > // if the digit exponent is smaller than the smallest desired digit for fractional cutoff,< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN913" > 913< / td > < td class = "line" > < span class = 'comment' > // pull the digit back into legal range at which point we will round to the appropriate value.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN914" > 914< / td > < td class = "line" > < span class = 'comment' > // Note that while our value for digitExponent is still an estimate, this is safe because it< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN915" > 915< / td > < td class = "line" > < span class = 'comment' > // only increases the number. This will either correct digitExponent to an accurate value or it< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN916" > 916< / td > < td class = "line" > < span class = 'comment' > // will clamp it above the accurate value.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN917" > 917< / td > < td class = "line" > < span class = 'keyword' > if< / span > (< span class = "mrange" > cutoffMode == CutoffMode_FractionLength< / span > & & digitExponent < = -(tS32)cutoffNumber)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path7" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 7< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path6" title = "Previous event (6)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'cutoffMode' is not equal to CutoffMode_FractionLength< / td > < td > < div class = "PathNav" > < a href = "#Path8" title = "Next event (8)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN918" > 918< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN919" > 919< / td > < td class = "line" > digitExponent = -(tS32)cutoffNumber + 1;< / td > < / tr >
< tr > < td class = "num" id = "LN920" > 920< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN921" > 921< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN922" > 922< / td > < td class = "line" > < span class = 'comment' > // Divide value by 10^digitExponent.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN923" > 923< / td > < td class = "line" > < span class = 'keyword' > if< / span > (< span class = "mrange" > digitExponent > 0< / span > )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path8" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 8< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path7" title = "Previous event (7)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'digitExponent' is < = 0< / td > < td > < div class = "PathNav" > < a href = "#Path9" title = "Next event (9)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path9" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 9< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path8" title = "Previous event (8)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path10" title = "Next event (10)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN924" > 924< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN925" > 925< / td > < td class = "line" > < span class = 'comment' > // The exponent is positive creating a division so we multiply up the scale.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN926" > 926< / td > < td class = "line" > tBigInt temp;< / td > < / tr >
< tr > < td class = "num" id = "LN927" > 927< / td > < td class = "line" > BigInt_MultiplyPow10( & temp, scale, digitExponent );< / td > < / tr >
< tr > < td class = "num" id = "LN928" > 928< / td > < td class = "line" > scale = temp;< / td > < / tr >
< tr > < td class = "num" id = "LN929" > 929< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN930" > 930< / td > < td class = "line" > < span class = 'keyword' > else< / span > < span class = 'keyword' > if< / span > (< span class = "mrange" > digitExponent < 0< / span > )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path10" class = "msg msgEvent" style = "margin-left:14ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 10< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path9" title = "Previous event (9)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'digitExponent' is > = 0< / td > < td > < div class = "PathNav" > < a href = "#Path11" title = "Next event (11)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path11" class = "msg msgControl" style = "margin-left:10ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 11< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path10" title = "Previous event (10)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path12" title = "Next event (12)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN931" > 931< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN932" > 932< / td > < td class = "line" > < span class = 'comment' > // The exponent is negative creating a multiplication so we multiply up the scaledValue,< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN933" > 933< / td > < td class = "line" > < span class = 'comment' > // scaledMarginLow and scaledMarginHigh.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN934" > 934< / td > < td class = "line" > tBigInt pow10;< / td > < / tr >
< tr > < td class = "num" id = "LN935" > 935< / td > < td class = "line" > BigInt_Pow10( & pow10, -digitExponent);< / td > < / tr >
< tr > < td class = "num" id = "LN936" > 936< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN937" > 937< / td > < td class = "line" > tBigInt temp;< / td > < / tr >
< tr > < td class = "num" id = "LN938" > 938< / td > < td class = "line" > BigInt_Multiply( & temp, scaledValue, pow10);< / td > < / tr >
< tr > < td class = "num" id = "LN939" > 939< / td > < td class = "line" > scaledValue = temp;< / td > < / tr >
< tr > < td class = "num" id = "LN940" > 940< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN941" > 941< / td > < td class = "line" > BigInt_Multiply( & temp, scaledMarginLow, pow10);< / td > < / tr >
< tr > < td class = "num" id = "LN942" > 942< / td > < td class = "line" > scaledMarginLow = temp;< / td > < / tr >
< tr > < td class = "num" id = "LN943" > 943< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN944" > 944< / td > < td class = "line" > < span class = 'keyword' > if< / span > (pScaledMarginHigh != & scaledMarginLow)< / td > < / tr >
< tr > < td class = "num" id = "LN945" > 945< / td > < td class = "line" > BigInt_Multiply2( pScaledMarginHigh, scaledMarginLow );< / td > < / tr >
< tr > < td class = "num" id = "LN946" > 946< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN947" > 947< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN948" > 948< / td > < td class = "line" > < span class = 'comment' > // If (value + marginHigh) > = 1, our estimate for digitExponent was too low< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN949" > 949< / td > < td class = "line" > tBigInt scaledValueHigh;< / td > < / tr >
< tr > < td class = "num" id = "LN950" > 950< / td > < td class = "line" > BigInt_Add( & scaledValueHigh, scaledValue, *pScaledMarginHigh );< / td > < / tr >
< tr > < td class = "num" id = "LN951" > 951< / td > < td class = "line" > < span class = 'keyword' > if< / span > ( BigInt_Compare(scaledValueHigh,scale) > = 0 )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path12" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 12< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path11" title = "Previous event (11)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path13" title = "Next event (13)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN952" > 952< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN953" > 953< / td > < td class = "line" > < span class = 'comment' > // The exponent estimate was incorrect.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN954" > 954< / td > < td class = "line" > < span class = 'comment' > // Increment the exponent and don't perform the premultiply needed< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN955" > 955< / td > < td class = "line" > < span class = 'comment' > // for the first loop iteration.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN956" > 956< / td > < td class = "line" > digitExponent = digitExponent + 1;< / td > < / tr >
< tr > < td class = "num" id = "LN957" > 957< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN958" > 958< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN959" > 959< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN960" > 960< / td > < td class = "line" > < span class = 'comment' > // The exponent estimate was correct.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN961" > 961< / td > < td class = "line" > < span class = 'comment' > // Multiply larger by the output base to prepare for the first loop iteration.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN962" > 962< / td > < td class = "line" > < span class = "mrange" > < span class = "mrange" > BigInt_Multiply10( & scaledValue )< / span > < / span > ;< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path13" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 13< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path12" title = "Previous event (12)" > ← < / a > < / div > < / td > < / td > < td > Calling 'BigInt_Multiply10'< / td > < td > < div class = "PathNav" > < a href = "#Path14" title = "Next event (14)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path16" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 16< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path15" title = "Previous event (15)" > ← < / a > < / div > < / td > < / td > < td > Returning from 'BigInt_Multiply10'< / td > < td > < div class = "PathNav" > < a href = "#Path17" title = "Next event (17)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN963" > 963< / td > < td class = "line" > BigInt_Multiply10( & scaledMarginLow );< / td > < / tr >
< tr > < td class = "num" id = "LN964" > 964< / td > < td class = "line" > < span class = 'keyword' > if< / span > (pScaledMarginHigh != & scaledMarginLow)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path17" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 17< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path16" title = "Previous event (16)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path18" title = "Next event (18)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN965" > 965< / td > < td class = "line" > BigInt_Multiply2( pScaledMarginHigh, scaledMarginLow );< / td > < / tr >
< tr > < td class = "num" id = "LN966" > 966< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN967" > 967< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN968" > 968< / td > < td class = "line" > < span class = 'comment' > // Compute the cutoff exponent (the exponent of the final digit to print).< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN969" > 969< / td > < td class = "line" > < span class = 'comment' > // Default to the maximum size of the output buffer.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN970" > 970< / td > < td class = "line" > tS32 cutoffExponent = digitExponent - bufferSize;< / td > < / tr >
< tr > < td class = "num" id = "LN971" > 971< / td > < td class = "line" > < span class = 'keyword' > switch< / span > (cutoffMode)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path18" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 18< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path17" title = "Previous event (17)" > ← < / a > < / div > < / td > < / td > < td > Control jumps to 'case CutoffMode_TotalLength:' at line 978< / td > < td > < div class = "PathNav" > < a href = "#Path19" title = "Next event (19)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN972" > 972< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN973" > 973< / td > < td class = "line" > < span class = 'comment' > // print digits until we pass the accuracy margin limits or buffer size< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN974" > 974< / td > < td class = "line" > < span class = 'keyword' > case< / span > CutoffMode_Unique:< / td > < / tr >
< tr > < td class = "num" id = "LN975" > 975< / td > < td class = "line" > < span class = 'keyword' > break< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN976" > 976< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN977" > 977< / td > < td class = "line" > < span class = 'comment' > // print cutoffNumber of digits or until we reach the buffer size< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN978" > 978< / td > < td class = "line" > < span class = 'keyword' > case< / span > CutoffMode_TotalLength:< / td > < / tr >
< tr > < td class = "num" id = "LN979" > 979< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN980" > 980< / td > < td class = "line" > tS32 desiredCutoffExponent = digitExponent - (tS32)cutoffNumber;< / td > < / tr >
< tr > < td class = "num" id = "LN981" > 981< / td > < td class = "line" > < span class = 'keyword' > if< / span > (desiredCutoffExponent > cutoffExponent)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path19" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 19< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path18" title = "Previous event (18)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path20" title = "Next event (20)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN982" > 982< / td > < td class = "line" > cutoffExponent = desiredCutoffExponent;< / td > < / tr >
< tr > < td class = "num" id = "LN983" > 983< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN984" > 984< / td > < td class = "line" > < span class = 'keyword' > break< / span > ;< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path20" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 20< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path19" title = "Previous event (19)" > ← < / a > < / div > < / td > < / td > < td > Execution continues on line 997< / td > < td > < div class = "PathNav" > < a href = "#Path21" title = "Next event (21)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN985" > 985< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN986" > 986< / td > < td class = "line" > < span class = 'comment' > // print cutoffNumber digits past the decimal point or until we reach the buffer size< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN987" > 987< / td > < td class = "line" > < span class = 'keyword' > case< / span > CutoffMode_FractionLength:< / td > < / tr >
< tr > < td class = "num" id = "LN988" > 988< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN989" > 989< / td > < td class = "line" > tS32 desiredCutoffExponent = -(tS32)cutoffNumber;< / td > < / tr >
< tr > < td class = "num" id = "LN990" > 990< / td > < td class = "line" > < span class = 'keyword' > if< / span > (desiredCutoffExponent > cutoffExponent)< / td > < / tr >
< tr > < td class = "num" id = "LN991" > 991< / td > < td class = "line" > cutoffExponent = desiredCutoffExponent;< / td > < / tr >
< tr > < td class = "num" id = "LN992" > 992< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN993" > 993< / td > < td class = "line" > < span class = 'keyword' > break< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN994" > 994< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN995" > 995< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN996" > 996< / td > < td class = "line" > < span class = 'comment' > // Output the exponent of the first digit we will print< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN997" > 997< / td > < td class = "line" > *pOutExponent = digitExponent-1;< / td > < / tr >
< tr > < td class = "num" id = "LN998" > 998< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN999" > 999< / td > < td class = "line" > < span class = 'comment' > // In preparation for calling BigInt_DivideWithRemainder_MaxQuotient9(),< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1000" > 1000< / td > < td class = "line" > < span class = 'comment' > // we need to scale up our values such that the highest block of the denominator< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1001" > 1001< / td > < td class = "line" > < span class = 'comment' > // is greater than or equal to 8. We also need to guarantee that the numerator< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1002" > 1002< / td > < td class = "line" > < span class = 'comment' > // can never have a length greater than the denominator after each loop iteration.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1003" > 1003< / td > < td class = "line" > < span class = 'comment' > // This requires the highest block of the denominator to be less than or equal to< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1004" > 1004< / td > < td class = "line" > < span class = 'comment' > // 429496729 which is the highest number that can be multiplied by 10 without< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1005" > 1005< / td > < td class = "line" > < span class = 'comment' > // overflowing to a new block.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1006" > 1006< / td > < td class = "line" > RJ_ASSERT( scale.GetLength() > 0 );< / td > < / tr >
< tr > < td class = "num" id = "LN1007" > 1007< / td > < td class = "line" > tU32 hiBlock = scale.GetBlock( scale.GetLength() - 1 );< / td > < / tr >
< tr > < td class = "num" id = "LN1008" > 1008< / td > < td class = "line" > < span class = 'keyword' > if< / span > (< span class = "mrange" > hiBlock < 8< / span > || < span class = "mrange" > hiBlock > 429496729< / span > )< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path21" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 21< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path20" title = "Previous event (20)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'hiBlock' is > = 8< / td > < td > < div class = "PathNav" > < a href = "#Path22" title = "Next event (22)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path22" class = "msg msgEvent" style = "margin-left:24ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 22< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path21" title = "Previous event (21)" > ← < / a > < / div > < / td > < / td > < td > Assuming 'hiBlock' is > 429496729< / td > < td > < div class = "PathNav" > < a href = "#Path23" title = "Next event (23)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path23" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 23< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path22" title = "Previous event (22)" > ← < / a > < / div > < / td > < / td > < td > Taking true branch< / td > < td > < div class = "PathNav" > < a href = "#Path24" title = "Next event (24)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN1009" > 1009< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1010" > 1010< / td > < td class = "line" > < span class = 'comment' > // Perform a bit shift on all values to get the highest block of the denominator into< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1011" > 1011< / td > < td class = "line" > < span class = 'comment' > // the range [8,429496729]. We are more likely to make accurate quotient estimations< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1012" > 1012< / td > < td class = "line" > < span class = 'comment' > // in BigInt_DivideWithRemainder_MaxQuotient9() with higher denominator values so< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1013" > 1013< / td > < td class = "line" > < span class = 'comment' > // we shift the denominator to place the highest bit at index 27 of the highest block.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1014" > 1014< / td > < td class = "line" > < span class = 'comment' > // This is safe because (2^28 - 1) = 268435455 which is less than 429496729. This means< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1015" > 1015< / td > < td class = "line" > < span class = 'comment' > // that all values with a highest bit at index 27 are within range.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1016" > 1016< / td > < td class = "line" > tU32 hiBlockLog2 = LogBase2(hiBlock);< / td > < / tr >
< tr > < td class = "num" id = "LN1017" > 1017< / td > < td class = "line" > RJ_ASSERT(hiBlockLog2 < 3 || hiBlockLog2 > 27);< / td > < / tr >
< tr > < td class = "num" id = "LN1018" > 1018< / td > < td class = "line" > tU32 shift = (32 + 27 - hiBlockLog2) % 32;< / td > < / tr >
< tr > < td class = "num" id = "LN1019" > 1019< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1020" > 1020< / td > < td class = "line" > BigInt_ShiftLeft( & scale, shift );< / td > < / tr >
< tr > < td class = "num" id = "LN1021" > 1021< / td > < td class = "line" > < span class = "mrange" > < span class = "mrange" > BigInt_ShiftLeft( & scaledValue, shift)< / span > < / span > ;< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path24" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 24< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path23" title = "Previous event (23)" > ← < / a > < / div > < / td > < / td > < td > Calling 'BigInt_ShiftLeft'< / td > < td > < div class = "PathNav" > < a href = "#Path25" title = "Next event (25)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path29" class = "msg msgEvent" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 29< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path28" title = "Previous event (28)" > ← < / a > < / div > < / td > < / td > < td > Returning from 'BigInt_ShiftLeft'< / td > < td > < div class = "PathNav" > < a href = "#Path30" title = "Next event (30)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN1022" > 1022< / td > < td class = "line" > BigInt_ShiftLeft( & scaledMarginLow, shift);< / td > < / tr >
< tr > < td class = "num" id = "LN1023" > 1023< / td > < td class = "line" > < span class = 'keyword' > if< / span > (pScaledMarginHigh != & scaledMarginLow)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path30" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 30< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path29" title = "Previous event (29)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path31" title = "Next event (31)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN1024" > 1024< / td > < td class = "line" > BigInt_Multiply2( pScaledMarginHigh, scaledMarginLow );< / td > < / tr >
< tr > < td class = "num" id = "LN1025" > 1025< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1026" > 1026< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1027" > 1027< / td > < td class = "line" > < span class = 'comment' > // These values are used to inspect why the print loop terminated so we can properly< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1028" > 1028< / td > < td class = "line" > < span class = 'comment' > // round the final digit.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1029" > 1029< / td > < td class = "line" > tB low; < span class = 'comment' > // did the value get within marginLow distance from zero< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1030" > 1030< / td > < td class = "line" > tB high; < span class = 'comment' > // did the value get within marginHigh distance from one< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1031" > 1031< / td > < td class = "line" > tU32 outputDigit; < span class = 'comment' > // current digit being output< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1032" > 1032< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1033" > 1033< / td > < td class = "line" > < span class = 'keyword' > if< / span > (cutoffMode == CutoffMode_Unique)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path31" class = "msg msgControl" style = "margin-left:5ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 31< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path30" title = "Previous event (30)" > ← < / a > < / div > < / td > < / td > < td > Taking false branch< / td > < td > < div class = "PathNav" > < a href = "#Path32" title = "Next event (32)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN1034" > 1034< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1035" > 1035< / td > < td class = "line" > < span class = 'comment' > // For the unique cutoff mode, we will try to print until we have reached a level of< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1036" > 1036< / td > < td class = "line" > < span class = 'comment' > // precision that uniquely distinguishes this value from its neighbors. If we run< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1037" > 1037< / td > < td class = "line" > < span class = 'comment' > // out of space in the output buffer, we terminate early.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1038" > 1038< / td > < td class = "line" > < span class = 'keyword' > for< / span > (;;)< / td > < / tr >
< tr > < td class = "num" id = "LN1039" > 1039< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1040" > 1040< / td > < td class = "line" > digitExponent = digitExponent-1;< / td > < / tr >
< tr > < td class = "num" id = "LN1041" > 1041< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1042" > 1042< / td > < td class = "line" > < span class = 'comment' > // divide out the scale to extract the digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1043" > 1043< / td > < td class = "line" > outputDigit = BigInt_DivideWithRemainder_MaxQuotient9(& scaledValue, scale);< / td > < / tr >
< tr > < td class = "num" id = "LN1044" > 1044< / td > < td class = "line" > RJ_ASSERT( outputDigit < 10 );< / td > < / tr >
< tr > < td class = "num" id = "LN1045" > 1045< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1046" > 1046< / td > < td class = "line" > < span class = 'comment' > // update the high end of the value< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1047" > 1047< / td > < td class = "line" > BigInt_Add( & scaledValueHigh, scaledValue, *pScaledMarginHigh );< / td > < / tr >
< tr > < td class = "num" id = "LN1048" > 1048< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1049" > 1049< / td > < td class = "line" > < span class = 'comment' > // stop looping if we are far enough away from our neighboring values< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1050" > 1050< / td > < td class = "line" > < span class = 'comment' > // or if we have reached the cutoff digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1051" > 1051< / td > < td class = "line" > low = BigInt_Compare(scaledValue, scaledMarginLow) < 0;< / td > < / tr >
< tr > < td class = "num" id = "LN1052" > 1052< / td > < td class = "line" > high = BigInt_Compare(scaledValueHigh, scale) > 0;< / td > < / tr >
< tr > < td class = "num" id = "LN1053" > 1053< / td > < td class = "line" > < span class = 'keyword' > if< / span > (low | high | (digitExponent == cutoffExponent))< / td > < / tr >
< tr > < td class = "num" id = "LN1054" > 1054< / td > < td class = "line" > < span class = 'keyword' > break< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN1055" > 1055< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1056" > 1056< / td > < td class = "line" > < span class = 'comment' > // store the output digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1057" > 1057< / td > < td class = "line" > *pCurDigit = (tC8)('0' + outputDigit);< / td > < / tr >
< tr > < td class = "num" id = "LN1058" > 1058< / td > < td class = "line" > ++pCurDigit;< / td > < / tr >
< tr > < td class = "num" id = "LN1059" > 1059< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1060" > 1060< / td > < td class = "line" > < span class = 'comment' > // multiply larger by the output base< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1061" > 1061< / td > < td class = "line" > BigInt_Multiply10( & scaledValue );< / td > < / tr >
< tr > < td class = "num" id = "LN1062" > 1062< / td > < td class = "line" > BigInt_Multiply10( & scaledMarginLow );< / td > < / tr >
< tr > < td class = "num" id = "LN1063" > 1063< / td > < td class = "line" > < span class = 'keyword' > if< / span > (pScaledMarginHigh != & scaledMarginLow)< / td > < / tr >
< tr > < td class = "num" id = "LN1064" > 1064< / td > < td class = "line" > BigInt_Multiply2( pScaledMarginHigh, scaledMarginLow );< / td > < / tr >
< tr > < td class = "num" id = "LN1065" > 1065< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1066" > 1066< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1067" > 1067< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1068" > 1068< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1069" > 1069< / td > < td class = "line" > < span class = 'comment' > // For length based cutoff modes, we will try to print until we< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1070" > 1070< / td > < td class = "line" > < span class = 'comment' > // have exhausted all precision (i.e. all remaining digits are zeros) or< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1071" > 1071< / td > < td class = "line" > < span class = 'comment' > // until we reach the desired cutoff digit.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1072" > 1072< / td > < td class = "line" > low = < span class = 'keyword' > false< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN1073" > 1073< / td > < td class = "line" > high = < span class = 'keyword' > false< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN1074" > 1074< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1075" > 1075< / td > < td class = "line" > < span class = 'keyword' > for< / span > (;;)< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path32" class = "msg msgControl" style = "margin-left:9ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexControl" > 32< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path31" title = "Previous event (31)" > ← < / a > < / div > < / td > < / td > < td > Loop condition is true. Entering loop body< / td > < td > < div class = "PathNav" > < a href = "#Path33" title = "Next event (33)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN1076" > 1076< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1077" > 1077< / td > < td class = "line" > digitExponent = digitExponent-1;< / td > < / tr >
< tr > < td class = "num" id = "LN1078" > 1078< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1079" > 1079< / td > < td class = "line" > < span class = 'comment' > // divide out the scale to extract the digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1080" > 1080< / td > < td class = "line" > outputDigit = < span class = "mrange" > BigInt_DivideWithRemainder_MaxQuotient9(& scaledValue, scale)< / span > ;< / td > < / tr >
< tr > < td class = "num" > < / td > < td class = "line" > < div id = "Path33" class = "msg msgEvent" style = "margin-left:27ex" > < table class = "msgT" > < tr > < td valign = "top" > < div class = "PathIndex PathIndexEvent" > 33< / div > < / td > < td > < div class = "PathNav" > < a href = "#Path32" title = "Previous event (32)" > ← < / a > < / div > < / td > < / td > < td > Calling 'BigInt_DivideWithRemainder_MaxQuotient9'< / td > < td > < div class = "PathNav" > < a href = "#Path34" title = "Next event (34)" > → < / a > < / div > < / td > < / tr > < / table > < / div > < / td > < / tr >
< tr > < td class = "num" id = "LN1081" > 1081< / td > < td class = "line" > RJ_ASSERT( outputDigit < 10 );< / td > < / tr >
< tr > < td class = "num" id = "LN1082" > 1082< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1083" > 1083< / td > < td class = "line" > < span class = 'keyword' > if< / span > ( scaledValue.IsZero() | (digitExponent == cutoffExponent) )< / td > < / tr >
< tr > < td class = "num" id = "LN1084" > 1084< / td > < td class = "line" > < span class = 'keyword' > break< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN1085" > 1085< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1086" > 1086< / td > < td class = "line" > < span class = 'comment' > // store the output digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1087" > 1087< / td > < td class = "line" > *pCurDigit = (tC8)('0' + outputDigit);< / td > < / tr >
< tr > < td class = "num" id = "LN1088" > 1088< / td > < td class = "line" > ++pCurDigit;< / td > < / tr >
< tr > < td class = "num" id = "LN1089" > 1089< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1090" > 1090< / td > < td class = "line" > < span class = 'comment' > // multiply larger by the output base< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1091" > 1091< / td > < td class = "line" > BigInt_Multiply10(& scaledValue);< / td > < / tr >
< tr > < td class = "num" id = "LN1092" > 1092< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1093" > 1093< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1094" > 1094< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1095" > 1095< / td > < td class = "line" > < span class = 'comment' > // round off the final digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1096" > 1096< / td > < td class = "line" > < span class = 'comment' > // default to rounding down if value got too close to 0< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1097" > 1097< / td > < td class = "line" > tB roundDown = low;< / td > < / tr >
< tr > < td class = "num" id = "LN1098" > 1098< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1099" > 1099< / td > < td class = "line" > < span class = 'comment' > // if it is legal to round up and down< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1100" > 1100< / td > < td class = "line" > < span class = 'keyword' > if< / span > (low == high)< / td > < / tr >
< tr > < td class = "num" id = "LN1101" > 1101< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1102" > 1102< / td > < td class = "line" > < span class = 'comment' > // round to the closest digit by comparing value with 0.5. To do this we need to convert< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1103" > 1103< / td > < td class = "line" > < span class = 'comment' > // the inequality to large integer values.< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1104" > 1104< / td > < td class = "line" > < span class = 'comment' > // compare( value, 0.5 )< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1105" > 1105< / td > < td class = "line" > < span class = 'comment' > // compare( scale * value, scale * 0.5 )< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1106" > 1106< / td > < td class = "line" > < span class = 'comment' > // compare( 2 * scale * value, scale )< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1107" > 1107< / td > < td class = "line" > BigInt_Multiply2(& scaledValue);< / td > < / tr >
< tr > < td class = "num" id = "LN1108" > 1108< / td > < td class = "line" > tS32 compare = BigInt_Compare(scaledValue, scale);< / td > < / tr >
< tr > < td class = "num" id = "LN1109" > 1109< / td > < td class = "line" > roundDown = compare < 0;< / td > < / tr >
< tr > < td class = "num" id = "LN1110" > 1110< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1111" > 1111< / td > < td class = "line" > < span class = 'comment' > // if we are directly in the middle, round towards the even digit (i.e. IEEE rouding rules)< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1112" > 1112< / td > < td class = "line" > < span class = 'keyword' > if< / span > (compare == 0)< / td > < / tr >
< tr > < td class = "num" id = "LN1113" > 1113< / td > < td class = "line" > roundDown = (outputDigit & 1) == 0;< / td > < / tr >
< tr > < td class = "num" id = "LN1114" > 1114< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1115" > 1115< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1116" > 1116< / td > < td class = "line" > < span class = 'comment' > // print the rounded digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1117" > 1117< / td > < td class = "line" > < span class = 'keyword' > if< / span > (roundDown)< / td > < / tr >
< tr > < td class = "num" id = "LN1118" > 1118< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1119" > 1119< / td > < td class = "line" > *pCurDigit = (tC8)('0' + outputDigit);< / td > < / tr >
< tr > < td class = "num" id = "LN1120" > 1120< / td > < td class = "line" > ++pCurDigit;< / td > < / tr >
< tr > < td class = "num" id = "LN1121" > 1121< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1122" > 1122< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1123" > 1123< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1124" > 1124< / td > < td class = "line" > < span class = 'comment' > // handle rounding up< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1125" > 1125< / td > < td class = "line" > < span class = 'keyword' > if< / span > (outputDigit == 9)< / td > < / tr >
< tr > < td class = "num" id = "LN1126" > 1126< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1127" > 1127< / td > < td class = "line" > < span class = 'comment' > // find the first non-nine prior digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1128" > 1128< / td > < td class = "line" > < span class = 'keyword' > for< / span > (;;)< / td > < / tr >
< tr > < td class = "num" id = "LN1129" > 1129< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1130" > 1130< / td > < td class = "line" > < span class = 'comment' > // if we are at the first digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1131" > 1131< / td > < td class = "line" > < span class = 'keyword' > if< / span > (pCurDigit == pOutBuffer)< / td > < / tr >
< tr > < td class = "num" id = "LN1132" > 1132< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1133" > 1133< / td > < td class = "line" > < span class = 'comment' > // output 1 at the next highest exponent< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1134" > 1134< / td > < td class = "line" > *pCurDigit = '1';< / td > < / tr >
< tr > < td class = "num" id = "LN1135" > 1135< / td > < td class = "line" > ++pCurDigit;< / td > < / tr >
< tr > < td class = "num" id = "LN1136" > 1136< / td > < td class = "line" > *pOutExponent += 1;< / td > < / tr >
< tr > < td class = "num" id = "LN1137" > 1137< / td > < td class = "line" > < span class = 'keyword' > break< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN1138" > 1138< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1139" > 1139< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1140" > 1140< / td > < td class = "line" > --pCurDigit;< / td > < / tr >
< tr > < td class = "num" id = "LN1141" > 1141< / td > < td class = "line" > < span class = 'keyword' > if< / span > (*pCurDigit != '9')< / td > < / tr >
< tr > < td class = "num" id = "LN1142" > 1142< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1143" > 1143< / td > < td class = "line" > < span class = 'comment' > // increment the digit< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1144" > 1144< / td > < td class = "line" > *pCurDigit += 1;< / td > < / tr >
< tr > < td class = "num" id = "LN1145" > 1145< / td > < td class = "line" > ++pCurDigit;< / td > < / tr >
< tr > < td class = "num" id = "LN1146" > 1146< / td > < td class = "line" > < span class = 'keyword' > break< / span > ;< / td > < / tr >
< tr > < td class = "num" id = "LN1147" > 1147< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1148" > 1148< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1149" > 1149< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1150" > 1150< / td > < td class = "line" > < span class = 'keyword' > else< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1151" > 1151< / td > < td class = "line" > {< / td > < / tr >
< tr > < td class = "num" id = "LN1152" > 1152< / td > < td class = "line" > < span class = 'comment' > // values in the range [0,8] can perform a simple round up< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1153" > 1153< / td > < td class = "line" > *pCurDigit = (tC8)('0' + outputDigit + 1);< / td > < / tr >
< tr > < td class = "num" id = "LN1154" > 1154< / td > < td class = "line" > ++pCurDigit;< / td > < / tr >
< tr > < td class = "num" id = "LN1155" > 1155< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1156" > 1156< / td > < td class = "line" > }< / td > < / tr >
< tr > < td class = "num" id = "LN1157" > 1157< / td > < td class = "line" > < / td > < / tr >
< tr > < td class = "num" id = "LN1158" > 1158< / td > < td class = "line" > < span class = 'comment' > // return the number of digits output< / span > < / td > < / tr >
< tr > < td class = "num" id = "LN1159" > 1159< / td > < td class = "line" > RJ_ASSERT(pCurDigit - pOutBuffer < = (tPtrDiff)bufferSize);< / td > < / tr >
< tr > < td class = "num" id = "LN1160" > 1160< / td > < td class = "line" > < span class = 'keyword' > return< / span > pCurDigit - pOutBuffer;< / td > < / tr >
< tr > < td class = "num" id = "LN1161" > 1161< / td > < td class = "line" > }< / td > < / tr >
< / table > < / body > < / html >