hedgewars/uFloat.pas
changeset 7688 9daa06188551
parent 7663 16e1422aee8e
child 7714 981001b84f0b
equal deleted inserted replaced
7686:fcdc864cdbef 7688:9daa06188551
   489     dec(p)
   489     dec(p)
   490     end
   490     end
   491 end;
   491 end;
   492 
   492 
   493 function hwSqrt(const t: hwFloat): hwFloat;
   493 function hwSqrt(const t: hwFloat): hwFloat;
       
   494 const pwr = 8; // even value, feel free to adjust
       
   495       rThreshold = 1 shl (pwr + 32);
       
   496       lThreshold = 1 shl (pwr div 2 + 32);
   494 var l, r: QWord;
   497 var l, r: QWord;
   495     c: hwFloat;
   498     c: hwFloat;
   496 begin
   499 begin
   497 hwSqrt.isNegative:= false;
   500 hwSqrt.isNegative:= false;
   498 
   501 
   501     l:= t.QWordValue;
   504     l:= t.QWordValue;
   502     r:= $100000000
   505     r:= $100000000
   503     end
   506     end
   504 else
   507 else
   505     begin
   508     begin
   506     l:= $100000000;
   509     if t.QWordValue > $FFFFFFFFFFFF then // t.Round > 65535.9999
   507     r:= t.QWordValue div 2 + $80000000; // r:= t / 2 + 0.5
   510         begin
   508     if r > $FFFFFFFFFFFF then
   511         l:= $10000000000; // 256
   509         r:= $FFFFFFFFFFFF
   512         r:= $FFFFFFFFFFFF; // 65535.9999
       
   513         end else
       
   514         if t.QWordValue >= rThreshold then
       
   515             begin
       
   516             l:= lThreshold;
       
   517             r:= $10000000000; // 256
       
   518             end else
       
   519             begin
       
   520             l:= $100000000;
       
   521             r:= lThreshold;
       
   522             end;
   510     end;
   523     end;
   511 
   524 
   512 repeat
   525 repeat
   513     c.QWordValue:= (l + r) div 2;
   526     c.QWordValue:= (l + r) shr 1;
   514     if hwSqr(c).QWordValue > t.QWordValue then
   527     if hwSqr(c).QWordValue > t.QWordValue then
   515         r:= c.QWordValue
   528         r:= c.QWordValue
   516     else
   529     else
   517         l:= c.QWordValue
   530         l:= c.QWordValue
   518 until r - l <= 1;
   531 until r - l <= 1;