前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原创反转精度算法:小数的终极编码

原创反转精度算法:小数的终极编码

作者头像
Jean
发布2020-07-01 16:11:18
7690
发布2020-07-01 16:11:18
举报
文章被收录于专栏:Web行业观察Web行业观察

上期带大家尝鲜了Zipack格式的“多快好省”:“多”指功能多;“快”指解析快;“省”指体积小。不过用户最好奇的一定是Zipack的底层原理,毕竟它“嚣张”地宣称拥有比UTF8和IEEE浮点数还棒的编码。这期详细介绍Zipack底层是如何通过原创的小数编码“反转精度算法”来取代经典的IEEE浮点数的。

目前主流的小数编码自然是IEEE浮点数,早在之前的一期《IEEE浮点数的设计缺陷》中就已经谈过IEEE浮点数的优缺点了,这里总结一下那期的结论:

IEEE浮点是经典的定长浮点数编码,兼容整数,也有许多优秀的思想,比如通过“隐式补一”的方法消除有效位的冗余,又让小数点从左端浮动,降低了指数位的绝对值。如果你听不懂我在说什么,参考下之前文章吧。

但是IEEE浮点数被淘汰的原因在于,违反了信息论“一一映射”的原则。比如它区分+0和-0,还有好多编码段都代表NaN。这些瑕疵在Zipack中是无法容忍的:Zipack的每种类型都是一一映射的,换句话讲,随机写一段二进制比特流都可以解析出合法的Zipack对象。

“精反算法”。。有内味了

咦?怎么有股“精神分裂,反社会人格”的味道在里面,算了就这样吧。

那反转精度算法(简称精反算法或精反编码)到底是怎么玩的呢?这里又要引出一个背景知识:VLQ偏移自然数【怎么样,Zipack复杂吧】。原理就不复述了,只要知道它是一个“一一映射”的自然数编码,而且是变长且无上限的。用VLQ偏移自然数可以表示任意一个自然数(0,1,2....)的二进制形式。“精反算法”的思路就是通过2个自然数表示一个小数:一个表示整数部分,一个表示小数部分。

在Zipack的“Number Family”中有5种实数类型,分别是小自然数、正整数、负整数、正小数、负小数。5种类型互补,意味着它们之间没有重合部分,理论上能表示实数轴上所有的数,只要允许无限长的字节。其中和精反算法相关的是正小数和负小数,由于正负小数完全对称,我们只要考虑无符号的正小数的情况就行了。

发挥想象,将每个无符号小数用字符串的形式表示,这样它就可以被小数点分为左右两部分:整数部分和小数部分。左部正好是一个自然数,用一个VLQ就能表示;右部而言,也可以用一个自然数唯一表示,但需要一些技巧:首先根据小学数学的知识点【小数点后末位的0无意义】确定最后一位一定是个“1”,再根据幼儿园数学的知识点【正整数的最高位一定是1】,我们成功将小数部分的倒序和正整数一一映射起来。(以上都是二进制的情况)

至于VLQ偏移自然数是从0开始的,我们只要给它平移1个单位就相当于从1开始了。下面是一个实例描述如何利用精反算法编码二进制小数110.0101。

  1. trim:去除两端无意义的“0”
  2. split:将110.0101分割成110和0101两部分
  3. encode:将左部的110编码成VLQ自然数,记作A
  4. reverse:将右部的0101反转成1010
  5. offset:1010 - 1 = 1001
  6. encode:将1001编码成VLQ自然数,记作B
  7. concat:将A与B无缝拼接,输出AB

这就是精妙绝伦的精反算法,七个步骤,简单易懂。之所以比IEEE浮点数更棒,因为精反算法做到一一映射,既没有歧义也没有冗余,更没有上限(VLQ的性质决定)。

在上面的例子中,我们得到AB以后还需要加上一个前缀才能合成一个Zipack对象:正小数的前缀是0xF2,负小数的前缀是0xF3。这些前缀通常是一个字节,用来表示接下来的对象的类型。我们可以去Zipack官网上体验一把精反算法的压缩效率:

在如图的这个例子中,十进制的“-0.125”首先被转换成二进制的“-0.001”,然后序列化成Zipack的负小数类型:[F3 00 03]。其中F3表示负小数,00表示整数部分,03表示小数部分。

精反算法只是Zipack的核心之一,Zipack的规范文档里记录着所有的核心思想和设计理念,让Zipack的性能甩JSON一大截。目前Zipack仍处于推广阶段,急需你这样的优秀人才。Gitee仓库:https://gitee.com/zipack/spec

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebHub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档