如何在算术编码中将双精度转换为其二进制形式?

How to convert a double to its' binary form in Arithmetic Coding?

本文关键字:转换 二进制 双精度 编码      更新时间:2023-10-16

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

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

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

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

将任何内容转换为二进制意味着找出涉及 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)一样,二进制表示也会发生同样的情况。在这些情况下,您必须在达到所需的精度时停止计算。

你应该调查IEEE 754

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