将浮点常量编码为极长的二进制字符串

时间:2017-07-07 13:31:50

标签: python binary ieee-754

最近,我一直在努力实施NIST SP800-22中描述的15项随机性测试。作为我的函数实现的检查,我一直在运行NIST文档为每个测试提供的示例。其中一些测试需要非常长的位串(高达一百万位)。例如,在其中一个示例中,输入是“ e 的前100,000位”。这就提出了一个问题:如何生成一个超出Python中浮点数可用精度的浮点值的位表示?

我找到了将整数转换为二进制字符串( bin()函数)的文章,并将浮点分数转换为二进制(重复除以2(慢!)并受浮点精度的限制)。我已经考虑过使用$ e = \ sum_ {n = 0} ^ {\ infty} \ frac {2n + 2} {(2n + 1)!} $以某种方式迭代地构造它,计算下一个部分值,转换它以二进制表示形式,并以某种方式将其添加到累积表示中(仍在考虑如何执行此操作)。然而,我沿着这条路走下了同样的墙:浮点值的精确度,因为我在这个总和上走得更远。

有没有人对从任意精确的浮点值创建任意长位字符串有一些建议?

PS - 另外,有没有办法让我的Markdown数学公式在上面正确渲染? :-)

1 个答案:

答案 0 :(得分:0)

我维护gmpy2库,它支持任意精度二进制算术。以下是生成e的前100位的示例。

>>> import gmpy2
>>> gmpy2.get_context().precision=100
>>> gmpy2.exp(1).digits(2)[0] 
'101011011111100001010100010110001010001010111011010010101001101010101
1111101110001010110001000000010'