equal
deleted
inserted
replaced
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; |