float.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:9k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libFLAC - Free Lossless Audio Codec library
  2.  * Copyright (C) 2004,2005  Josh Coalson
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * - Redistributions of source code must retain the above copyright
  9.  * notice, this list of conditions and the following disclaimer.
  10.  *
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  * notice, this list of conditions and the following disclaimer in the
  13.  * documentation and/or other materials provided with the distribution.
  14.  *
  15.  * - Neither the name of the Xiph.org Foundation nor the names of its
  16.  * contributors may be used to endorse or promote products derived from
  17.  * this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20.  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22.  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29.  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.  */
  31. #include "FLAC/assert.h"
  32. #include "private/float.h"
  33. #ifdef FLAC__INTEGER_ONLY_LIBRARY
  34. /* adjust for compilers that can't understand using LLU suffix for uint64_t literals */
  35. #ifdef _MSC_VER
  36. #define FLAC__U64L(x) x
  37. #else
  38. #define FLAC__U64L(x) x##LLU
  39. #endif
  40. const FLAC__fixedpoint FLAC__FP_ZERO = 0;
  41. const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000;
  42. const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000;
  43. const FLAC__fixedpoint FLAC__FP_LN2 = 45426;
  44. const FLAC__fixedpoint FLAC__FP_E = 178145;
  45. /* Lookup tables for Knuth's logarithm algorithm */
  46. #define LOG2_LOOKUP_PRECISION 16
  47. static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = {
  48. {
  49. /*
  50.  * 0 fraction bits
  51.  */
  52. /* undefined */ 0x00000000,
  53. /* lg(2/1) = */ 0x00000001,
  54. /* lg(4/3) = */ 0x00000000,
  55. /* lg(8/7) = */ 0x00000000,
  56. /* lg(16/15) = */ 0x00000000,
  57. /* lg(32/31) = */ 0x00000000,
  58. /* lg(64/63) = */ 0x00000000,
  59. /* lg(128/127) = */ 0x00000000,
  60. /* lg(256/255) = */ 0x00000000,
  61. /* lg(512/511) = */ 0x00000000,
  62. /* lg(1024/1023) = */ 0x00000000,
  63. /* lg(2048/2047) = */ 0x00000000,
  64. /* lg(4096/4095) = */ 0x00000000,
  65. /* lg(8192/8191) = */ 0x00000000,
  66. /* lg(16384/16383) = */ 0x00000000,
  67. /* lg(32768/32767) = */ 0x00000000
  68. },
  69. {
  70. /*
  71.  * 4 fraction bits
  72.  */
  73. /* undefined */ 0x00000000,
  74. /* lg(2/1) = */ 0x00000010,
  75. /* lg(4/3) = */ 0x00000007,
  76. /* lg(8/7) = */ 0x00000003,
  77. /* lg(16/15) = */ 0x00000001,
  78. /* lg(32/31) = */ 0x00000001,
  79. /* lg(64/63) = */ 0x00000000,
  80. /* lg(128/127) = */ 0x00000000,
  81. /* lg(256/255) = */ 0x00000000,
  82. /* lg(512/511) = */ 0x00000000,
  83. /* lg(1024/1023) = */ 0x00000000,
  84. /* lg(2048/2047) = */ 0x00000000,
  85. /* lg(4096/4095) = */ 0x00000000,
  86. /* lg(8192/8191) = */ 0x00000000,
  87. /* lg(16384/16383) = */ 0x00000000,
  88. /* lg(32768/32767) = */ 0x00000000
  89. },
  90. {
  91. /*
  92.  * 8 fraction bits
  93.  */
  94. /* undefined */ 0x00000000,
  95. /* lg(2/1) = */ 0x00000100,
  96. /* lg(4/3) = */ 0x0000006a,
  97. /* lg(8/7) = */ 0x00000031,
  98. /* lg(16/15) = */ 0x00000018,
  99. /* lg(32/31) = */ 0x0000000c,
  100. /* lg(64/63) = */ 0x00000006,
  101. /* lg(128/127) = */ 0x00000003,
  102. /* lg(256/255) = */ 0x00000001,
  103. /* lg(512/511) = */ 0x00000001,
  104. /* lg(1024/1023) = */ 0x00000000,
  105. /* lg(2048/2047) = */ 0x00000000,
  106. /* lg(4096/4095) = */ 0x00000000,
  107. /* lg(8192/8191) = */ 0x00000000,
  108. /* lg(16384/16383) = */ 0x00000000,
  109. /* lg(32768/32767) = */ 0x00000000
  110. },
  111. {
  112. /*
  113.  * 12 fraction bits
  114.  */
  115. /* undefined */ 0x00000000,
  116. /* lg(2/1) = */ 0x00001000,
  117. /* lg(4/3) = */ 0x000006a4,
  118. /* lg(8/7) = */ 0x00000315,
  119. /* lg(16/15) = */ 0x0000017d,
  120. /* lg(32/31) = */ 0x000000bc,
  121. /* lg(64/63) = */ 0x0000005d,
  122. /* lg(128/127) = */ 0x0000002e,
  123. /* lg(256/255) = */ 0x00000017,
  124. /* lg(512/511) = */ 0x0000000c,
  125. /* lg(1024/1023) = */ 0x00000006,
  126. /* lg(2048/2047) = */ 0x00000003,
  127. /* lg(4096/4095) = */ 0x00000001,
  128. /* lg(8192/8191) = */ 0x00000001,
  129. /* lg(16384/16383) = */ 0x00000000,
  130. /* lg(32768/32767) = */ 0x00000000
  131. },
  132. {
  133. /*
  134.  * 16 fraction bits
  135.  */
  136. /* undefined */ 0x00000000,
  137. /* lg(2/1) = */ 0x00010000,
  138. /* lg(4/3) = */ 0x00006a40,
  139. /* lg(8/7) = */ 0x00003151,
  140. /* lg(16/15) = */ 0x000017d6,
  141. /* lg(32/31) = */ 0x00000bba,
  142. /* lg(64/63) = */ 0x000005d1,
  143. /* lg(128/127) = */ 0x000002e6,
  144. /* lg(256/255) = */ 0x00000172,
  145. /* lg(512/511) = */ 0x000000b9,
  146. /* lg(1024/1023) = */ 0x0000005c,
  147. /* lg(2048/2047) = */ 0x0000002e,
  148. /* lg(4096/4095) = */ 0x00000017,
  149. /* lg(8192/8191) = */ 0x0000000c,
  150. /* lg(16384/16383) = */ 0x00000006,
  151. /* lg(32768/32767) = */ 0x00000003
  152. },
  153. {
  154. /*
  155.  * 20 fraction bits
  156.  */
  157. /* undefined */ 0x00000000,
  158. /* lg(2/1) = */ 0x00100000,
  159. /* lg(4/3) = */ 0x0006a3fe,
  160. /* lg(8/7) = */ 0x00031513,
  161. /* lg(16/15) = */ 0x00017d60,
  162. /* lg(32/31) = */ 0x0000bb9d,
  163. /* lg(64/63) = */ 0x00005d10,
  164. /* lg(128/127) = */ 0x00002e59,
  165. /* lg(256/255) = */ 0x00001721,
  166. /* lg(512/511) = */ 0x00000b8e,
  167. /* lg(1024/1023) = */ 0x000005c6,
  168. /* lg(2048/2047) = */ 0x000002e3,
  169. /* lg(4096/4095) = */ 0x00000171,
  170. /* lg(8192/8191) = */ 0x000000b9,
  171. /* lg(16384/16383) = */ 0x0000005c,
  172. /* lg(32768/32767) = */ 0x0000002e
  173. },
  174. {
  175. /*
  176.  * 24 fraction bits
  177.  */
  178. /* undefined */ 0x00000000,
  179. /* lg(2/1) = */ 0x01000000,
  180. /* lg(4/3) = */ 0x006a3fe6,
  181. /* lg(8/7) = */ 0x00315130,
  182. /* lg(16/15) = */ 0x0017d605,
  183. /* lg(32/31) = */ 0x000bb9ca,
  184. /* lg(64/63) = */ 0x0005d0fc,
  185. /* lg(128/127) = */ 0x0002e58f,
  186. /* lg(256/255) = */ 0x0001720e,
  187. /* lg(512/511) = */ 0x0000b8d8,
  188. /* lg(1024/1023) = */ 0x00005c61,
  189. /* lg(2048/2047) = */ 0x00002e2d,
  190. /* lg(4096/4095) = */ 0x00001716,
  191. /* lg(8192/8191) = */ 0x00000b8b,
  192. /* lg(16384/16383) = */ 0x000005c5,
  193. /* lg(32768/32767) = */ 0x000002e3
  194. },
  195. {
  196. /*
  197.  * 28 fraction bits
  198.  */
  199. /* undefined */ 0x00000000,
  200. /* lg(2/1) = */ 0x10000000,
  201. /* lg(4/3) = */ 0x06a3fe5c,
  202. /* lg(8/7) = */ 0x03151301,
  203. /* lg(16/15) = */ 0x017d6049,
  204. /* lg(32/31) = */ 0x00bb9ca6,
  205. /* lg(64/63) = */ 0x005d0fba,
  206. /* lg(128/127) = */ 0x002e58f7,
  207. /* lg(256/255) = */ 0x001720da,
  208. /* lg(512/511) = */ 0x000b8d87,
  209. /* lg(1024/1023) = */ 0x0005c60b,
  210. /* lg(2048/2047) = */ 0x0002e2d7,
  211. /* lg(4096/4095) = */ 0x00017160,
  212. /* lg(8192/8191) = */ 0x0000b8ad,
  213. /* lg(16384/16383) = */ 0x00005c56,
  214. /* lg(32768/32767) = */ 0x00002e2b
  215. }
  216. };
  217. #if 0
  218. static const FLAC__uint64 log2_lookup_wide[] = {
  219. {
  220. /*
  221.  * 32 fraction bits
  222.  */
  223. /* undefined */ 0x00000000,
  224. /* lg(2/1) = */ FLAC__U64L(0x100000000),
  225. /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6),
  226. /* lg(8/7) = */ FLAC__U64L(0x31513015),
  227. /* lg(16/15) = */ FLAC__U64L(0x17d60497),
  228. /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65),
  229. /* lg(64/63) = */ FLAC__U64L(0x05d0fba2),
  230. /* lg(128/127) = */ FLAC__U64L(0x02e58f74),
  231. /* lg(256/255) = */ FLAC__U64L(0x01720d9c),
  232. /* lg(512/511) = */ FLAC__U64L(0x00b8d875),
  233. /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa),
  234. /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72),
  235. /* lg(4096/4095) = */ FLAC__U64L(0x00171600),
  236. /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2),
  237. /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d),
  238. /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac)
  239. },
  240. {
  241. /*
  242.  * 48 fraction bits
  243.  */
  244. /* undefined */ 0x00000000,
  245. /* lg(2/1) = */ FLAC__U64L(0x1000000000000),
  246. /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429),
  247. /* lg(8/7) = */ FLAC__U64L(0x315130157f7a),
  248. /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb),
  249. /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac),
  250. /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd),
  251. /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee),
  252. /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8),
  253. /* lg(512/511) = */ FLAC__U64L(0xb8d8752173),
  254. /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e),
  255. /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8),
  256. /* lg(4096/4095) = */ FLAC__U64L(0x1716001719),
  257. /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b),
  258. /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d),
  259. /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52)
  260. }
  261. };
  262. #endif
  263. FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision)
  264. {
  265. const FLAC__uint32 ONE = (1u << fracbits);
  266. const FLAC__uint32 *table = log2_lookup[fracbits >> 2];
  267. FLAC__ASSERT(fracbits < 32);
  268. FLAC__ASSERT((fracbits & 0x3) == 0);
  269. if(x < ONE)
  270. return 0;
  271. if(precision > LOG2_LOOKUP_PRECISION)
  272. precision = LOG2_LOOKUP_PRECISION;
  273. /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */
  274. {
  275. FLAC__uint32 y = 0;
  276. FLAC__uint32 z = x >> 1, k = 1;
  277. while (x > ONE && k < precision) {
  278. if (x - z >= ONE) {
  279. x -= z;
  280. z = x >> k;
  281. y += table[k];
  282. }
  283. else {
  284. z >>= 1;
  285. k++;
  286. }
  287. }
  288. return y;
  289. }
  290. }
  291. #endif /* defined FLAC__INTEGER_ONLY_LIBRARY */