首页 > 解决方案 > 这是间接使用 IEEE754 double 将 unsigned big int 转换为所需的位/字节的可行方法吗

问题描述

鉴于无法访问位移位的限制(仅通过整数代数模拟),我试图找到一种方法将一个大的无符号整数粗略地转换为所需的位和所需的字节,而无需调用自然对数ln()函数(即l()在 gnu- BC /log()内部 awk。)。

> x = 6,691,116,205,376,531,392,736,014,379,
>           253,763,829,659,326,853,258,036.

的相对精确值ln(10)/ln(256)是 ~ 0.41524101186092029348。我发现它5/12在实际值的 34bps 之内。

我在这里可能错了 - 由于 Gelfond-Schneider 定理,该值是超越的吗?

在这里使用 awk 语法 2^16 is 16th power of 2, not 2 bitwise-xor 16,我发现

printf("%.g", x^(5/-12)) = 3e-22 -> 22 bytes needed

ceiling( ln(x)/ln(256) ) = ceiling( 21.520072467 ) = 22

相同的概念,差异角-> length(sprintf("%.f",x^(5/12))) = 22

使用 %.f 是必不可少的,因为其他格式代码可能会导致科学记数法截断,因此测量的长度()错误。

同样,为了获得所需精度的位,我懒惰地使用 10/3 作为 log₂(10) 的代理,误差在 40bps 以内:

printf("%.g", x^(10/-3))= 2e-173 -> 173 bits needed

ceiling( ln(x)/ln(2) ) = ceiling(172.161) = 173

我觉得我错过了一些关键的东西,因为这似乎太直接了。我错过了什么?

标签: awkdoubleieee-754approximation

解决方案


推荐阅读