如何在算术编码中将double转换为'二进制形式?

时间:2012-06-12 08:18:34

标签: c++ math compression

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

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

3 个答案:

答案 0 :(得分:3)

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

请参阅Practical Implementations of Arithmetic CodingIntroduction 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

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