| 1478 | /// \param exp exponent |
| 1479 | /// \return square root as Q1.F/2 |
| 1480 | template<unsigned int F> uint32 sqrt(uint32 &r, int &exp) |
| 1481 | { |
| 1482 | int i = exp & 1; |
| 1483 | r <<= i; |
| 1484 | exp = (exp-i) / 2; |
| 1485 | uint32 m = 0; |
| 1486 | for(uint32 bit=static_cast<uint32>(1)<<F; bit; bit>>=2) |
| 1487 | { |
| 1488 | if(r < m+bit) |
| 1489 | m >>= 1; |
| 1490 | else |
| 1491 | { |
| 1492 | r -= m + bit; |
| 1493 | m = (m>>1) + bit; |
| 1494 | } |
| 1495 | } |
| 1496 | return m; |
| 1497 | } |
| 1498 | |
| 1499 | /// Fixed point binary exponential. |
| 1500 | /// This uses the BKM algorithm in E-mode. |