2

我现在正在做算术编码,我得到了最终的起始位置和距离,然后我添加它们。如何将结果转换为二进制模式?

例如,如何在 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;
}
4

3 回答 3

3

算术编码是使用整数数据类型完成的,以提高效率和可预测性。使用浮点类型没有优点,只有缺点。您可以简单地将 n 位的整数视为 n 位小数。当您从顶部取出位时,您重新规范化分数以使用这些位。

请参阅算术编码的实际实现和算术编码简介- 理论与实践

于 2012-06-12T14:33:57.613 回答
2

将任何东西转换为二进制意味着找出每种 2 的幂的数量。在十进制数的情况下,所涉及的幂是负数。

对于.125,顺序如下:

.125 x 2 =  .250 (< 1)
.250 x 2 =  .500 (< 1)
.500 x 2 = 1.000 (>= 1)
.000     = 0     done

所以,二进制表示是0x 2^-1+ 0x 2^-2+ 1x 2^-3=.001二进制。作为练习,将此技术与将普通整数转换为二进制表示进行对比。

正如常规小数可以具有非终止模式(如 1/3 或 pi/4),二进制表示也可能发生同样的情况。在这些情况下,您必须在达到所需精度时停止计算。

于 2012-06-12T08:26:17.597 回答
1

您应该调查IEEE 754

这是浮点格式的二进制表示标准,单精度和双精度

于 2012-06-12T08:30:37.503 回答