我现在正在进行算术编码,我有最终的起始位置和距离,然后我添加它们。 如何将结果转换为二进制模式?
例如,如何在C ++中将0.125 decimal
转换为0.001 binary
?
void CArithmeticCoding::Encode()
{
if ( 0 == m_input )
return;
printf("The input is [%s].\n", this->m_input);
while (*m_input)
{
if ( *m_input == m_MPS )
{
DOMPS();
}
else
{
DOLPS();
}
++m_input;
}
double ret = m_start + m_dis;
return;
}
答案 0 :(得分:3)
算术编码使用整数数据类型完成,以提高效率和可预测性。使用浮点类型没有优点也没有优点。您可以简单地将n位的整数视为n位分数。当您从顶部取出位时,您可以重新规范分数以使用这些位。
请参阅Practical Implementations of Arithmetic Coding和Introduction to Arithmetic Coding - Theory and Practice。
答案 1 :(得分:2)
将任何东西转换为二进制意味着找出涉及2种各种权力的数量。在十进制数的情况下,涉及的权力是负数。
对于.125
,序列如下:
.125 x 2 = .250 (< 1)
.250 x 2 = .500 (< 1)
.500 x 2 = 1.000 (>= 1)
.000 = 0 done
因此,二进制表示为0
x 2^-1
+ 0
x 2^-2
+ 1
x 2^-3
= .001
二进制文件。作为练习,将此技术与将正常整数转换为二进制表示形成对比。
正如常规小数可以具有非终止模式(如1/3或pi / 4)一样,二进制表示也会发生同样的情况。在这些情况下,您必须在达到所需精度时停止计算。
答案 2 :(得分:1)
您应该调查IEEE 754
这是浮点格式的二进制表示的标准,包括单精度和双精度