SmallFloat.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:5k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2005 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. namespace Lucene.Net.Util
  18. {
  19. /// <summary>Floating point numbers smaller than 32 bits.
  20. /// 
  21. /// </summary>
  22. /// <author>  yonik
  23. /// </author>
  24. /// <version>  $Id$
  25. /// </version>
  26. public class SmallFloat
  27. {
  28. /// <summary>Converts a 32 bit float to an 8 bit float.
  29. /// <br>Values less than zero are all mapped to zero.
  30. /// <br>Values are truncated (rounded down) to the nearest 8 bit value.
  31. /// <br>Values between zero and the smallest representable value
  32. /// are rounded up.
  33. /// 
  34. /// </summary>
  35. /// <param name="f">the 32 bit float to be converted to an 8 bit float (byte)
  36. /// </param>
  37. /// <param name="numMantissaBits">the number of mantissa bits to use in the byte, with the remainder to be used in the exponent
  38. /// </param>
  39. /// <param name="zeroExp">the zero-point in the range of exponent values
  40. /// </param>
  41. /// <returns> the 8 bit float representation
  42. /// </returns>
  43. public static sbyte FloatToByte(float f, int numMantissaBits, int zeroExp)
  44. {
  45. // Adjustment from a float zero exponent to our zero exponent,
  46. // shifted over to our exponent position.
  47. int fzero = (63 - zeroExp) << numMantissaBits;
  48.             int bits = System.BitConverter.ToInt32(System.BitConverter.GetBytes(f), 0);
  49. int smallfloat = bits >> (24 - numMantissaBits);
  50. if (smallfloat < fzero)
  51. {
  52. return (bits <= 0) ? (sbyte) 0 : (sbyte) 1; // underflow is mapped to smallest non-zero number.
  53. }
  54. else if (smallfloat >= fzero + 0x100)
  55. {
  56. return - 1; // overflow maps to largest number
  57. }
  58. else
  59. {
  60. return (sbyte) (smallfloat - fzero);
  61. }
  62. }
  63. /// <summary>Converts an 8 bit float to a 32 bit float. </summary>
  64. public static float ByteToFloat(byte b, int numMantissaBits, int zeroExp)
  65. {
  66. // on Java1.5 & 1.6 JVMs, prebuilding a decoding array and doing a lookup
  67. // is only a little bit faster (anywhere from 0% to 7%)
  68. if (b == 0)
  69. return 0.0f;
  70. int bits = (b & 0xff) << (24 - numMantissaBits);
  71. bits += ((63 - zeroExp) << 24);
  72. return BitConverter.ToSingle(BitConverter.GetBytes(bits), 0);
  73. }
  74. //
  75. // Some specializations of the generic functions follow.
  76. // The generic functions are just as fast with current (1.5)
  77. // -server JVMs, but still slower with client JVMs.
  78. //
  79. /// <summary>floatToByte(b, mantissaBits=3, zeroExponent=15)
  80. /// <br>smallest non-zero value = 5.820766E-10
  81. /// <br>largest value = 7.5161928E9
  82. /// <br>epsilon = 0.125
  83. /// </summary>
  84. public static sbyte FloatToByte315(float f)
  85. {
  86.             int bits = System.BitConverter.ToInt32(System.BitConverter.GetBytes(f), 0);
  87. int smallfloat = bits >> (24 - 3);
  88. if (smallfloat < (63 - 15) << 3)
  89. {
  90. return (bits <= 0) ? (sbyte) 0 : (sbyte) 1;
  91. }
  92. if (smallfloat >= ((63 - 15) << 3) + 0x100)
  93. {
  94. return - 1;
  95. }
  96. return (sbyte) (smallfloat - ((63 - 15) << 3));
  97. }
  98. /// <summary>byteToFloat(b, mantissaBits=3, zeroExponent=15) </summary>
  99. public static float Byte315ToFloat(byte b)
  100. {
  101. // on Java1.5 & 1.6 JVMs, prebuilding a decoding array and doing a lookup
  102. // is only a little bit faster (anywhere from 0% to 7%)
  103. if (b == 0)
  104. return 0.0f;
  105. int bits = (b & 0xff) << (24 - 3);
  106. bits += ((63 - 15) << 24);
  107. return BitConverter.ToSingle(BitConverter.GetBytes(bits), 0);
  108. }
  109. /// <summary>floatToByte(b, mantissaBits=5, zeroExponent=2)
  110. /// <br>smallest nonzero value = 0.033203125
  111. /// <br>largest value = 1984.0
  112. /// <br>epsilon = 0.03125
  113. /// </summary>
  114. public static sbyte FloatToByte52(float f)
  115. {
  116.             int bits = System.BitConverter.ToInt32(System.BitConverter.GetBytes(f), 0);
  117. int smallfloat = bits >> (24 - 5);
  118. if (smallfloat < (63 - 2) << 5)
  119. {
  120. return (bits <= 0) ? (sbyte) 0 : (sbyte) 1;
  121. }
  122. if (smallfloat >= ((63 - 2) << 5) + 0x100)
  123. {
  124. return - 1;
  125. }
  126. return (sbyte) (smallfloat - ((63 - 2) << 5));
  127. }
  128. /// <summary>byteToFloat(b, mantissaBits=5, zeroExponent=2) </summary>
  129. public static float Byte52ToFloat(byte b)
  130. {
  131. // on Java1.5 & 1.6 JVMs, prebuilding a decoding array and doing a lookup
  132. // is only a little bit faster (anywhere from 0% to 7%)
  133. if (b == 0)
  134. return 0.0f;
  135. int bits = (b & 0xff) << (24 - 5);
  136. bits += ((63 - 2) << 24);
  137. return BitConverter.ToSingle(BitConverter.GetBytes(bits), 0);
  138. }
  139. }
  140. }