123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /* Copyright 2013 Google Inc. All Rights Reserved.
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
- */
- /* Utilities for fast computation of logarithms. */
- #ifndef BROTLI_ENC_FAST_LOG_H_
- #define BROTLI_ENC_FAST_LOG_H_
- #include <math.h>
- #include "../common/platform.h"
- #include <brotli/types.h>
- #if defined(__cplusplus) || defined(c_plusplus)
- extern "C" {
- #endif
- static BROTLI_INLINE uint32_t Log2FloorNonZero(size_t n) {
- #if defined(BROTLI_BSR32)
- return BROTLI_BSR32((uint32_t)n);
- #else
- uint32_t result = 0;
- while (n >>= 1) result++;
- return result;
- #endif
- }
- #define BROTLI_LOG2_TABLE_SIZE 256
- /* A lookup table for small values of log2(int) to be used in entropy
- computation. */
- BROTLI_INTERNAL extern const double kBrotliLog2Table[BROTLI_LOG2_TABLE_SIZE];
- /* Visual Studio 2012 and Android API levels < 18 do not have the log2()
- * function defined, so we use log() and a multiplication instead. */
- #if !defined(BROTLI_HAVE_LOG2)
- #if ((defined(_MSC_VER) && _MSC_VER <= 1700) || \
- (defined(__ANDROID_API__) && __ANDROID_API__ < 18))
- #define BROTLI_HAVE_LOG2 0
- #else
- #define BROTLI_HAVE_LOG2 1
- #endif
- #endif
- #define LOG_2_INV 1.4426950408889634
- /* Faster logarithm for small integers, with the property of log2(0) == 0. */
- static BROTLI_INLINE double FastLog2(size_t v) {
- if (v < BROTLI_LOG2_TABLE_SIZE) {
- return kBrotliLog2Table[v];
- }
- #if !(BROTLI_HAVE_LOG2)
- return log((double)v) * LOG_2_INV;
- #else
- return log2((double)v);
- #endif
- }
- #if defined(__cplusplus) || defined(c_plusplus)
- } /* extern "C" */
- #endif
- #endif /* BROTLI_ENC_FAST_LOG_H_ */
|