1*05a0b428SJohn Marino /* $OpenBSD: b_log__D.c,v 1.4 2009/10/27 23:59:29 deraadt Exp $ */ 2*05a0b428SJohn Marino /* 3*05a0b428SJohn Marino * Copyright (c) 1992, 1993 4*05a0b428SJohn Marino * The Regents of the University of California. All rights reserved. 5*05a0b428SJohn Marino * 6*05a0b428SJohn Marino * Redistribution and use in source and binary forms, with or without 7*05a0b428SJohn Marino * modification, are permitted provided that the following conditions 8*05a0b428SJohn Marino * are met: 9*05a0b428SJohn Marino * 1. Redistributions of source code must retain the above copyright 10*05a0b428SJohn Marino * notice, this list of conditions and the following disclaimer. 11*05a0b428SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 12*05a0b428SJohn Marino * notice, this list of conditions and the following disclaimer in the 13*05a0b428SJohn Marino * documentation and/or other materials provided with the distribution. 14*05a0b428SJohn Marino * 3. Neither the name of the University nor the names of its contributors 15*05a0b428SJohn Marino * may be used to endorse or promote products derived from this software 16*05a0b428SJohn Marino * without specific prior written permission. 17*05a0b428SJohn Marino * 18*05a0b428SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19*05a0b428SJohn Marino * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*05a0b428SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*05a0b428SJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22*05a0b428SJohn Marino * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*05a0b428SJohn Marino * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*05a0b428SJohn Marino * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*05a0b428SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26*05a0b428SJohn Marino * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27*05a0b428SJohn Marino * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28*05a0b428SJohn Marino * SUCH DAMAGE. 29*05a0b428SJohn Marino */ 30*05a0b428SJohn Marino 31*05a0b428SJohn Marino #include "math.h" 32*05a0b428SJohn Marino #include "math_private.h" 33*05a0b428SJohn Marino 34*05a0b428SJohn Marino /* Table-driven natural logarithm. 35*05a0b428SJohn Marino * 36*05a0b428SJohn Marino * This code was derived, with minor modifications, from: 37*05a0b428SJohn Marino * Peter Tang, "Table-Driven Implementation of the 38*05a0b428SJohn Marino * Logarithm in IEEE Floating-Point arithmetic." ACM Trans. 39*05a0b428SJohn Marino * Math Software, vol 16. no 4, pp 378-400, Dec 1990). 40*05a0b428SJohn Marino * 41*05a0b428SJohn Marino * Calculates log(2^m*F*(1+f/F)), |f/j| <= 1/256, 42*05a0b428SJohn Marino * where F = j/128 for j an integer in [0, 128]. 43*05a0b428SJohn Marino * 44*05a0b428SJohn Marino * log(2^m) = log2_hi*m + log2_tail*m 45*05a0b428SJohn Marino * since m is an integer, the dominant term is exact. 46*05a0b428SJohn Marino * m has at most 10 digits (for subnormal numbers), 47*05a0b428SJohn Marino * and log2_hi has 11 trailing zero bits. 48*05a0b428SJohn Marino * 49*05a0b428SJohn Marino * log(F) = logF_hi[j] + logF_lo[j] is in tabular form in log_table.h 50*05a0b428SJohn Marino * logF_hi[] + 512 is exact. 51*05a0b428SJohn Marino * 52*05a0b428SJohn Marino * log(1+f/F) = 2*f/(2*F + f) + 1/12 * (2*f/(2*F + f))**3 + ... 53*05a0b428SJohn Marino * the leading term is calculated to extra precision in two 54*05a0b428SJohn Marino * parts, the larger of which adds exactly to the dominant 55*05a0b428SJohn Marino * m and F terms. 56*05a0b428SJohn Marino * There are two cases: 57*05a0b428SJohn Marino * 1. when m, j are non-zero (m | j), use absolute 58*05a0b428SJohn Marino * precision for the leading term. 59*05a0b428SJohn Marino * 2. when m = j = 0, |1-x| < 1/256, and log(x) ~= (x-1). 60*05a0b428SJohn Marino * In this case, use a relative precision of 24 bits. 61*05a0b428SJohn Marino * (This is done differently in the original paper) 62*05a0b428SJohn Marino * 63*05a0b428SJohn Marino * Special cases: 64*05a0b428SJohn Marino * 0 return signalling -Inf 65*05a0b428SJohn Marino * neg return signalling NaN 66*05a0b428SJohn Marino * +Inf return +Inf 67*05a0b428SJohn Marino */ 68*05a0b428SJohn Marino 69*05a0b428SJohn Marino #define N 128 70*05a0b428SJohn Marino 71*05a0b428SJohn Marino /* Table of log(Fj) = logF_head[j] + logF_tail[j], for Fj = 1+j/128. 72*05a0b428SJohn Marino * Used for generation of extend precision logarithms. 73*05a0b428SJohn Marino * The constant 35184372088832 is 2^45, so the divide is exact. 74*05a0b428SJohn Marino * It ensures correct reading of logF_head, even for inaccurate 75*05a0b428SJohn Marino * decimal-to-binary conversion routines. (Everybody gets the 76*05a0b428SJohn Marino * right answer for integers less than 2^53.) 77*05a0b428SJohn Marino * Values for log(F) were generated using error < 10^-57 absolute 78*05a0b428SJohn Marino * with the bc -l package. 79*05a0b428SJohn Marino */ 80*05a0b428SJohn Marino static const double A1 = .08333333333333178827; 81*05a0b428SJohn Marino static const double A2 = .01250000000377174923; 82*05a0b428SJohn Marino static const double A3 = .002232139987919447809; 83*05a0b428SJohn Marino static const double A4 = .0004348877777076145742; 84*05a0b428SJohn Marino 85*05a0b428SJohn Marino static const double logF_head[N+1] = { 86*05a0b428SJohn Marino 0., 87*05a0b428SJohn Marino .007782140442060381246, 88*05a0b428SJohn Marino .015504186535963526694, 89*05a0b428SJohn Marino .023167059281547608406, 90*05a0b428SJohn Marino .030771658666765233647, 91*05a0b428SJohn Marino .038318864302141264488, 92*05a0b428SJohn Marino .045809536031242714670, 93*05a0b428SJohn Marino .053244514518837604555, 94*05a0b428SJohn Marino .060624621816486978786, 95*05a0b428SJohn Marino .067950661908525944454, 96*05a0b428SJohn Marino .075223421237524235039, 97*05a0b428SJohn Marino .082443669210988446138, 98*05a0b428SJohn Marino .089612158689760690322, 99*05a0b428SJohn Marino .096729626458454731618, 100*05a0b428SJohn Marino .103796793681567578460, 101*05a0b428SJohn Marino .110814366340264314203, 102*05a0b428SJohn Marino .117783035656430001836, 103*05a0b428SJohn Marino .124703478501032805070, 104*05a0b428SJohn Marino .131576357788617315236, 105*05a0b428SJohn Marino .138402322859292326029, 106*05a0b428SJohn Marino .145182009844575077295, 107*05a0b428SJohn Marino .151916042025732167530, 108*05a0b428SJohn Marino .158605030176659056451, 109*05a0b428SJohn Marino .165249572895390883786, 110*05a0b428SJohn Marino .171850256926518341060, 111*05a0b428SJohn Marino .178407657472689606947, 112*05a0b428SJohn Marino .184922338493834104156, 113*05a0b428SJohn Marino .191394852999565046047, 114*05a0b428SJohn Marino .197825743329758552135, 115*05a0b428SJohn Marino .204215541428766300668, 116*05a0b428SJohn Marino .210564769107350002741, 117*05a0b428SJohn Marino .216873938300523150246, 118*05a0b428SJohn Marino .223143551314024080056, 119*05a0b428SJohn Marino .229374101064877322642, 120*05a0b428SJohn Marino .235566071312860003672, 121*05a0b428SJohn Marino .241719936886966024758, 122*05a0b428SJohn Marino .247836163904594286577, 123*05a0b428SJohn Marino .253915209980732470285, 124*05a0b428SJohn Marino .259957524436686071567, 125*05a0b428SJohn Marino .265963548496984003577, 126*05a0b428SJohn Marino .271933715484010463114, 127*05a0b428SJohn Marino .277868451003087102435, 128*05a0b428SJohn Marino .283768173130738432519, 129*05a0b428SJohn Marino .289633292582948342896, 130*05a0b428SJohn Marino .295464212893421063199, 131*05a0b428SJohn Marino .301261330578199704177, 132*05a0b428SJohn Marino .307025035294827830512, 133*05a0b428SJohn Marino .312755710004239517729, 134*05a0b428SJohn Marino .318453731118097493890, 135*05a0b428SJohn Marino .324119468654316733591, 136*05a0b428SJohn Marino .329753286372579168528, 137*05a0b428SJohn Marino .335355541920762334484, 138*05a0b428SJohn Marino .340926586970454081892, 139*05a0b428SJohn Marino .346466767346100823488, 140*05a0b428SJohn Marino .351976423156884266063, 141*05a0b428SJohn Marino .357455888922231679316, 142*05a0b428SJohn Marino .362905493689140712376, 143*05a0b428SJohn Marino .368325561158599157352, 144*05a0b428SJohn Marino .373716409793814818840, 145*05a0b428SJohn Marino .379078352934811846353, 146*05a0b428SJohn Marino .384411698910298582632, 147*05a0b428SJohn Marino .389716751140440464951, 148*05a0b428SJohn Marino .394993808240542421117, 149*05a0b428SJohn Marino .400243164127459749579, 150*05a0b428SJohn Marino .405465108107819105498, 151*05a0b428SJohn Marino .410659924985338875558, 152*05a0b428SJohn Marino .415827895143593195825, 153*05a0b428SJohn Marino .420969294644237379543, 154*05a0b428SJohn Marino .426084395310681429691, 155*05a0b428SJohn Marino .431173464818130014464, 156*05a0b428SJohn Marino .436236766774527495726, 157*05a0b428SJohn Marino .441274560805140936281, 158*05a0b428SJohn Marino .446287102628048160113, 159*05a0b428SJohn Marino .451274644139630254358, 160*05a0b428SJohn Marino .456237433481874177232, 161*05a0b428SJohn Marino .461175715122408291790, 162*05a0b428SJohn Marino .466089729924533457960, 163*05a0b428SJohn Marino .470979715219073113985, 164*05a0b428SJohn Marino .475845904869856894947, 165*05a0b428SJohn Marino .480688529345570714212, 166*05a0b428SJohn Marino .485507815781602403149, 167*05a0b428SJohn Marino .490303988045525329653, 168*05a0b428SJohn Marino .495077266798034543171, 169*05a0b428SJohn Marino .499827869556611403822, 170*05a0b428SJohn Marino .504556010751912253908, 171*05a0b428SJohn Marino .509261901790523552335, 172*05a0b428SJohn Marino .513945751101346104405, 173*05a0b428SJohn Marino .518607764208354637958, 174*05a0b428SJohn Marino .523248143765158602036, 175*05a0b428SJohn Marino .527867089620485785417, 176*05a0b428SJohn Marino .532464798869114019908, 177*05a0b428SJohn Marino .537041465897345915436, 178*05a0b428SJohn Marino .541597282432121573947, 179*05a0b428SJohn Marino .546132437597407260909, 180*05a0b428SJohn Marino .550647117952394182793, 181*05a0b428SJohn Marino .555141507540611200965, 182*05a0b428SJohn Marino .559615787935399566777, 183*05a0b428SJohn Marino .564070138285387656651, 184*05a0b428SJohn Marino .568504735352689749561, 185*05a0b428SJohn Marino .572919753562018740922, 186*05a0b428SJohn Marino .577315365035246941260, 187*05a0b428SJohn Marino .581691739635061821900, 188*05a0b428SJohn Marino .586049045003164792433, 189*05a0b428SJohn Marino .590387446602107957005, 190*05a0b428SJohn Marino .594707107746216934174, 191*05a0b428SJohn Marino .599008189645246602594, 192*05a0b428SJohn Marino .603290851438941899687, 193*05a0b428SJohn Marino .607555250224322662688, 194*05a0b428SJohn Marino .611801541106615331955, 195*05a0b428SJohn Marino .616029877215623855590, 196*05a0b428SJohn Marino .620240409751204424537, 197*05a0b428SJohn Marino .624433288012369303032, 198*05a0b428SJohn Marino .628608659422752680256, 199*05a0b428SJohn Marino .632766669570628437213, 200*05a0b428SJohn Marino .636907462236194987781, 201*05a0b428SJohn Marino .641031179420679109171, 202*05a0b428SJohn Marino .645137961373620782978, 203*05a0b428SJohn Marino .649227946625615004450, 204*05a0b428SJohn Marino .653301272011958644725, 205*05a0b428SJohn Marino .657358072709030238911, 206*05a0b428SJohn Marino .661398482245203922502, 207*05a0b428SJohn Marino .665422632544505177065, 208*05a0b428SJohn Marino .669430653942981734871, 209*05a0b428SJohn Marino .673422675212350441142, 210*05a0b428SJohn Marino .677398823590920073911, 211*05a0b428SJohn Marino .681359224807238206267, 212*05a0b428SJohn Marino .685304003098281100392, 213*05a0b428SJohn Marino .689233281238557538017, 214*05a0b428SJohn Marino .693147180560117703862 215*05a0b428SJohn Marino }; 216*05a0b428SJohn Marino 217*05a0b428SJohn Marino static const double logF_tail[N+1] = { 218*05a0b428SJohn Marino 0., 219*05a0b428SJohn Marino -.00000000000000543229938420049, 220*05a0b428SJohn Marino .00000000000000172745674997061, 221*05a0b428SJohn Marino -.00000000000001323017818229233, 222*05a0b428SJohn Marino -.00000000000001154527628289872, 223*05a0b428SJohn Marino -.00000000000000466529469958300, 224*05a0b428SJohn Marino .00000000000005148849572685810, 225*05a0b428SJohn Marino -.00000000000002532168943117445, 226*05a0b428SJohn Marino -.00000000000005213620639136504, 227*05a0b428SJohn Marino -.00000000000001819506003016881, 228*05a0b428SJohn Marino .00000000000006329065958724544, 229*05a0b428SJohn Marino .00000000000008614512936087814, 230*05a0b428SJohn Marino -.00000000000007355770219435028, 231*05a0b428SJohn Marino .00000000000009638067658552277, 232*05a0b428SJohn Marino .00000000000007598636597194141, 233*05a0b428SJohn Marino .00000000000002579999128306990, 234*05a0b428SJohn Marino -.00000000000004654729747598444, 235*05a0b428SJohn Marino -.00000000000007556920687451336, 236*05a0b428SJohn Marino .00000000000010195735223708472, 237*05a0b428SJohn Marino -.00000000000017319034406422306, 238*05a0b428SJohn Marino -.00000000000007718001336828098, 239*05a0b428SJohn Marino .00000000000010980754099855238, 240*05a0b428SJohn Marino -.00000000000002047235780046195, 241*05a0b428SJohn Marino -.00000000000008372091099235912, 242*05a0b428SJohn Marino .00000000000014088127937111135, 243*05a0b428SJohn Marino .00000000000012869017157588257, 244*05a0b428SJohn Marino .00000000000017788850778198106, 245*05a0b428SJohn Marino .00000000000006440856150696891, 246*05a0b428SJohn Marino .00000000000016132822667240822, 247*05a0b428SJohn Marino -.00000000000007540916511956188, 248*05a0b428SJohn Marino -.00000000000000036507188831790, 249*05a0b428SJohn Marino .00000000000009120937249914984, 250*05a0b428SJohn Marino .00000000000018567570959796010, 251*05a0b428SJohn Marino -.00000000000003149265065191483, 252*05a0b428SJohn Marino -.00000000000009309459495196889, 253*05a0b428SJohn Marino .00000000000017914338601329117, 254*05a0b428SJohn Marino -.00000000000001302979717330866, 255*05a0b428SJohn Marino .00000000000023097385217586939, 256*05a0b428SJohn Marino .00000000000023999540484211737, 257*05a0b428SJohn Marino .00000000000015393776174455408, 258*05a0b428SJohn Marino -.00000000000036870428315837678, 259*05a0b428SJohn Marino .00000000000036920375082080089, 260*05a0b428SJohn Marino -.00000000000009383417223663699, 261*05a0b428SJohn Marino .00000000000009433398189512690, 262*05a0b428SJohn Marino .00000000000041481318704258568, 263*05a0b428SJohn Marino -.00000000000003792316480209314, 264*05a0b428SJohn Marino .00000000000008403156304792424, 265*05a0b428SJohn Marino -.00000000000034262934348285429, 266*05a0b428SJohn Marino .00000000000043712191957429145, 267*05a0b428SJohn Marino -.00000000000010475750058776541, 268*05a0b428SJohn Marino -.00000000000011118671389559323, 269*05a0b428SJohn Marino .00000000000037549577257259853, 270*05a0b428SJohn Marino .00000000000013912841212197565, 271*05a0b428SJohn Marino .00000000000010775743037572640, 272*05a0b428SJohn Marino .00000000000029391859187648000, 273*05a0b428SJohn Marino -.00000000000042790509060060774, 274*05a0b428SJohn Marino .00000000000022774076114039555, 275*05a0b428SJohn Marino .00000000000010849569622967912, 276*05a0b428SJohn Marino -.00000000000023073801945705758, 277*05a0b428SJohn Marino .00000000000015761203773969435, 278*05a0b428SJohn Marino .00000000000003345710269544082, 279*05a0b428SJohn Marino -.00000000000041525158063436123, 280*05a0b428SJohn Marino .00000000000032655698896907146, 281*05a0b428SJohn Marino -.00000000000044704265010452446, 282*05a0b428SJohn Marino .00000000000034527647952039772, 283*05a0b428SJohn Marino -.00000000000007048962392109746, 284*05a0b428SJohn Marino .00000000000011776978751369214, 285*05a0b428SJohn Marino -.00000000000010774341461609578, 286*05a0b428SJohn Marino .00000000000021863343293215910, 287*05a0b428SJohn Marino .00000000000024132639491333131, 288*05a0b428SJohn Marino .00000000000039057462209830700, 289*05a0b428SJohn Marino -.00000000000026570679203560751, 290*05a0b428SJohn Marino .00000000000037135141919592021, 291*05a0b428SJohn Marino -.00000000000017166921336082431, 292*05a0b428SJohn Marino -.00000000000028658285157914353, 293*05a0b428SJohn Marino -.00000000000023812542263446809, 294*05a0b428SJohn Marino .00000000000006576659768580062, 295*05a0b428SJohn Marino -.00000000000028210143846181267, 296*05a0b428SJohn Marino .00000000000010701931762114254, 297*05a0b428SJohn Marino .00000000000018119346366441110, 298*05a0b428SJohn Marino .00000000000009840465278232627, 299*05a0b428SJohn Marino -.00000000000033149150282752542, 300*05a0b428SJohn Marino -.00000000000018302857356041668, 301*05a0b428SJohn Marino -.00000000000016207400156744949, 302*05a0b428SJohn Marino .00000000000048303314949553201, 303*05a0b428SJohn Marino -.00000000000071560553172382115, 304*05a0b428SJohn Marino .00000000000088821239518571855, 305*05a0b428SJohn Marino -.00000000000030900580513238244, 306*05a0b428SJohn Marino -.00000000000061076551972851496, 307*05a0b428SJohn Marino .00000000000035659969663347830, 308*05a0b428SJohn Marino .00000000000035782396591276383, 309*05a0b428SJohn Marino -.00000000000046226087001544578, 310*05a0b428SJohn Marino .00000000000062279762917225156, 311*05a0b428SJohn Marino .00000000000072838947272065741, 312*05a0b428SJohn Marino .00000000000026809646615211673, 313*05a0b428SJohn Marino -.00000000000010960825046059278, 314*05a0b428SJohn Marino .00000000000002311949383800537, 315*05a0b428SJohn Marino -.00000000000058469058005299247, 316*05a0b428SJohn Marino -.00000000000002103748251144494, 317*05a0b428SJohn Marino -.00000000000023323182945587408, 318*05a0b428SJohn Marino -.00000000000042333694288141916, 319*05a0b428SJohn Marino -.00000000000043933937969737844, 320*05a0b428SJohn Marino .00000000000041341647073835565, 321*05a0b428SJohn Marino .00000000000006841763641591466, 322*05a0b428SJohn Marino .00000000000047585534004430641, 323*05a0b428SJohn Marino .00000000000083679678674757695, 324*05a0b428SJohn Marino -.00000000000085763734646658640, 325*05a0b428SJohn Marino .00000000000021913281229340092, 326*05a0b428SJohn Marino -.00000000000062242842536431148, 327*05a0b428SJohn Marino -.00000000000010983594325438430, 328*05a0b428SJohn Marino .00000000000065310431377633651, 329*05a0b428SJohn Marino -.00000000000047580199021710769, 330*05a0b428SJohn Marino -.00000000000037854251265457040, 331*05a0b428SJohn Marino .00000000000040939233218678664, 332*05a0b428SJohn Marino .00000000000087424383914858291, 333*05a0b428SJohn Marino .00000000000025218188456842882, 334*05a0b428SJohn Marino -.00000000000003608131360422557, 335*05a0b428SJohn Marino -.00000000000050518555924280902, 336*05a0b428SJohn Marino .00000000000078699403323355317, 337*05a0b428SJohn Marino -.00000000000067020876961949060, 338*05a0b428SJohn Marino .00000000000016108575753932458, 339*05a0b428SJohn Marino .00000000000058527188436251509, 340*05a0b428SJohn Marino -.00000000000035246757297904791, 341*05a0b428SJohn Marino -.00000000000018372084495629058, 342*05a0b428SJohn Marino .00000000000088606689813494916, 343*05a0b428SJohn Marino .00000000000066486268071468700, 344*05a0b428SJohn Marino .00000000000063831615170646519, 345*05a0b428SJohn Marino .00000000000025144230728376072, 346*05a0b428SJohn Marino -.00000000000017239444525614834 347*05a0b428SJohn Marino }; 348*05a0b428SJohn Marino 349*05a0b428SJohn Marino /* 350*05a0b428SJohn Marino * Extra precision variant, returning struct {double a, b;}; 351*05a0b428SJohn Marino * log(x) = a+b to 63 bits, with a rounded to 26 bits. 352*05a0b428SJohn Marino */ 353*05a0b428SJohn Marino struct Double 354*05a0b428SJohn Marino __log__D(double x) 355*05a0b428SJohn Marino { 356*05a0b428SJohn Marino int m, j; 357*05a0b428SJohn Marino double F, f, g, q, u, v, u2; 358*05a0b428SJohn Marino volatile double u1; 359*05a0b428SJohn Marino struct Double r; 360*05a0b428SJohn Marino 361*05a0b428SJohn Marino /* Argument reduction: 1 <= g < 2; x/2^m = g; */ 362*05a0b428SJohn Marino /* y = F*(1 + f/F) for |f| <= 2^-8 */ 363*05a0b428SJohn Marino 364*05a0b428SJohn Marino m = logb(x); 365*05a0b428SJohn Marino g = ldexp(x, -m); 366*05a0b428SJohn Marino if (m == -1022) { 367*05a0b428SJohn Marino j = logb(g); 368*05a0b428SJohn Marino m += j; 369*05a0b428SJohn Marino g = ldexp(g, -j); 370*05a0b428SJohn Marino } 371*05a0b428SJohn Marino j = N*(g-1) + .5; 372*05a0b428SJohn Marino F = (1.0/N) * j + 1; 373*05a0b428SJohn Marino f = g - F; 374*05a0b428SJohn Marino 375*05a0b428SJohn Marino g = 1/(2*F+f); 376*05a0b428SJohn Marino u = 2*f*g; 377*05a0b428SJohn Marino v = u*u; 378*05a0b428SJohn Marino q = u*v*(A1 + v*(A2 + v*(A3 + v*A4))); 379*05a0b428SJohn Marino if (m | j) { 380*05a0b428SJohn Marino u1 = u + 513; 381*05a0b428SJohn Marino u1 -= 513; 382*05a0b428SJohn Marino } 383*05a0b428SJohn Marino else { 384*05a0b428SJohn Marino u1 = u; 385*05a0b428SJohn Marino TRUNC(u1); 386*05a0b428SJohn Marino } 387*05a0b428SJohn Marino u2 = (2.0*(f - F*u1) - u1*f) * g; 388*05a0b428SJohn Marino 389*05a0b428SJohn Marino u1 += m*logF_head[N] + logF_head[j]; 390*05a0b428SJohn Marino 391*05a0b428SJohn Marino u2 += logF_tail[j]; u2 += q; 392*05a0b428SJohn Marino u2 += logF_tail[N]*m; 393*05a0b428SJohn Marino r.a = u1 + u2; /* Only difference is here */ 394*05a0b428SJohn Marino TRUNC(r.a); 395*05a0b428SJohn Marino r.b = (u1 - r.a) + u2; 396*05a0b428SJohn Marino return (r); 397*05a0b428SJohn Marino } 398