Abh*_*V R 9 java compression algorithm math
我必须在Java中将浮点转换为32位定点.
无法理解什么是32位定点?
任何身体都可以帮助算法吗?
Mat*_*ewD 24
定点数是使用整数部分的类型的特定数量的位的实数的表示,以及小数部分的类型的剩余位.表示每个部分的位数是固定的(因此名称,定点).整数类型通常用于存储定点值.
定点数通常用于没有浮点支持的系统,或者需要比浮点数更快的速度.可以使用CPU的整数指令执行定点计算.
32位定点数将存储在32位类型中,例如int.
通常,(在这种情况下为无符号)整数类型中的每个位将表示整数值2 ^ n,如下所示:
1 0 1 1 0 0 1 0 = 2^7 + 2^5 + 2^4 + 2^1 = 178
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
Run Code Online (Sandbox Code Playgroud)
但是,如果该类型用于存储定点值,则这些位的解释略有不同:
1 0 1 1 0 0 1 0 = 2^3 + 2^1 + 2^0 + 2^-3 = 11.125
2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4
Run Code Online (Sandbox Code Playgroud)
上例中的固定点数称为4.4定点数,因为整数部分有4位,数字的小数部分有4位.在32位类型中,定点值通常为16.16格式,但也可以是24.8,28.4或任何其他组合.
从浮点值转换为定点值涉及以下步骤:
显然,你可以在数字的小数部分失去一些精确度.如果小数部分的精度很重要,定点格式的选择可以反映这一点 - 例如.使用16.16或8.24而不是24.8.
如果需要对定点数进行签名,也可以以相同的方式处理负值.
如果我的Java更强大,我会尝试一些代码,但我通常用C语言写这些东西,所以我不会尝试Java版本.此外,堆叠器的版本对我来说看起来不错,但有一个小例外,它不提供舍入的可能性.他甚至会告诉你如何进行乘法运算(转变非常重要!)
一个非常简单的转换为定点的示例,它显示了如何将PI乘以2。将结果转换回两倍,以证明在使用整数进行计算时尾数未丢失。
您可以使用sin()和cos()查找表等轻松地扩展它。我建议您如果打算使用定点查找Java定点库。
public class Fix {
public static final int FIXED_POINT = 16;
public static final int ONE = 1 << FIXED_POINT;
public static int mul(int a, int b) {
return (int) ((long) a * (long) b >> FIXED_POINT);
}
public static int toFix( double val ) {
return (int) (val * ONE);
}
public static int intVal( int fix ) {
return fix >> FIXED_POINT;
}
public static double doubleVal( int fix ) {
return ((double) fix) / ONE;
}
public static void main(String[] args) {
int f1 = toFix( Math.PI );
int f2 = toFix( 2 );
int result = mul( f1, f2 );
System.out.println( "f1:" + f1 + "," + intVal( f1 ) );
System.out.println( "f2:" + f2 + "," + intVal( f2 ) );
System.out.println( "r:" + result +"," + intVal( result));
System.out.println( "double: " + doubleVal( result ));
}
}
Run Code Online (Sandbox Code Playgroud)
输出值
f1:205887,3
f2:131072,2
r:411774,6
double: 6.283172607421875
Run Code Online (Sandbox Code Playgroud)
32 位定点的定义可能有所不同。定点的一般思想是,小数点(或二进制小数点)之前有一些固定数量的位数,小数点(或二进制小数点)之后有另一个固定数量的位数。对于 32 位来说,最常见的分割可能是偶数(前 16 个,后 16 个),但根据目的,无法保证这一点。
就转换而言,它再次对一些变化持开放态度 - 例如,如果输入数字超出目标范围,您可能想要做任意数量的不同事情(例如,在某些情况下,环绕可能是有意义的) ,但在其他情况下饱和度可能是首选)。
| 归档时间: |
|
| 查看次数: |
22309 次 |
| 最近记录: |