/**************************************************************************** * libs/libc/fixedmath/lib_ubsqrt.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include /**************************************************************************** * Public Functions ****************************************************************************/ #ifdef CONFIG_HAVE_LONG_LONG /**************************************************************************** * Name: ub32sqrtub16 * * Description: * ub32sqrtub16 calculates square root for 'a' * ****************************************************************************/ ub16_t ub32sqrtub16(ub32_t a) { uint64_t n = a; uint64_t xk = n; /* Direct conversion of ub32_t to uint64_t is same operation as multiplying * 'a' by 2^32, therefore n = a * 2^32. */ if (xk == UINT64_MAX) { /* Avoid 'xk + n / xk' overflow on first iteration. */ xk = (uint64_t)1 << 63; } while (xk) { uint64_t xk1 = (xk + n / xk) >> 1; if (xk1 >= xk) { break; } xk = xk1; } /* 'xk' now holds 'sqrt(n)' => 'sqrt(a * 2^32)' => 'sqrt(a) * 2^16', thus * 'xk' holds square root of 'a' in ub16_t format. */ return (ub16_t)xk; } #endif /**************************************************************************** * Name: ub16sqrtub8 * * Description: * ub16sqrtub8 calculates square root for 'a' * ****************************************************************************/ ub8_t ub16sqrtub8(ub16_t a) { uint32_t n = a; uint32_t xk = n; /* Direct conversion of ub16_t to uint32_t is same operation as multiplying * 'a' by 2^16, therefore n = a * 2^16. */ if (xk == UINT32_MAX) { /* Avoid 'xk + n / xk' overflow on first iteration. */ xk = (uint32_t)1 << 31; } while (xk) { uint32_t xk1 = (xk + n / xk) >> 1; if (xk1 >= xk) { break; } xk = xk1; } /* 'xk' now holds 'sqrt(n)' => 'sqrt(a * 2^16)' => 'sqrt(a) * 2^8', thus * 'xk' holds square root of 'a' in ub8_t format. */ return (ub8_t)xk; }