如何获取非常大的数字(PHP)的log()?

如何获取非常大的数字(PHP)的log()?,php,Php,我已经看过了,以及在php中处理非常大的数字。但似乎没有一个函数与php的log()等效。例如,我想这样做: $result = log($bigNumber, 2); 有人知道用php获得任意精度点数的对数基数2的另一种方法吗?也许我错过了一个函数,或库,或公式 编辑:php bignumbers似乎只有一个logbase 10函数log10()一般来说,如果您想实现自己的高精度日志计算,我建议首先使用对数的基本功能: log_a(x) = log_b(x) / log_b(a) |=>

我已经看过了,以及在php中处理非常大的数字。但似乎没有一个函数与php的
log()
等效。例如,我想这样做:

$result = log($bigNumber, 2);
有人知道用php获得任意精度点数的对数基数2的另一种方法吗?也许我错过了一个函数,或库,或公式


编辑:php bignumbers似乎只有一个logbase 10函数
log10()

一般来说,如果您想实现自己的高精度日志计算,我建议首先使用对数的基本功能:

log_a(x) = log_b(x) / log_b(a) |=> thus you can recalulate logarith to any base
log(x*y) = log(x) + log(y)
log(a**n) = n*log(a)
其中log_a(x)-表示x的底a的对数;对数表示自然对数

所以
log(10000000000000000000.123)=21*log(1.000000000000000000000.123)

以及高精度的日志(1+x) 使用在中引用的算法

通常,如果您想实现自己的高精度对数计算,我建议您首先使用对数的基本功能:

log_a(x) = log_b(x) / log_b(a) |=> thus you can recalulate logarith to any base
log(x*y) = log(x) + log(y)
log(a**n) = n*log(a)
其中log_a(x)-表示x的底a的对数;对数表示自然对数

所以
log(10000000000000000000.123)=21*log(1.000000000000000000000.123)

以及高精度的日志(1+x) 使用在中引用的算法

结合目前的建议,一种解决方案是使用以下公式:

log2($num) = log10($num) / log10(2)
与php big numbers结合使用,因为它有一个预先制作的log10函数

例如,安装php big numbers库后,请使用:

$log2 = log10($bigNum) / log10(2);

就我个人而言,我决定使用不同的数学/逻辑,这样就不需要log函数,而只需对大数字使用bcmath。

结合目前的建议,一种解决方案是使用以下公式:

log2($num) = log10($num) / log10(2)
与php big numbers结合使用,因为它有一个预先制作的log10函数

例如,安装php big numbers库后,请使用:

$log2 = log10($bigNum) / log10(2);

就我个人而言,我决定使用不同的数学/逻辑,这样就不需要log函数,而只需使用bcmath来处理大数字。

基数2的一大优点是计数和移位成为工具集的一部分

因此,获取一个数字的“log2”的一种方法是将其转换为二进制字符串并计算位

通过在循环中除以2,可以等效地实现这一点。但在我看来,计数会更有效率

如果从右边计数,则可以使用gmp\U scan0和gmp\U scan1。但是你必须以某种方式将混合的比特转换成所有的1和0

但是使用gmp_strval(num,2),您可以生成一个字符串并对其执行strpos

如果要转换整个值,可以对其执行(strlen-1)


显然,这只适用于需要整数日志的情况。

基数2的一大优点是计数和移位成为工具集的一部分

因此,获取一个数字的“log2”的一种方法是将其转换为二进制字符串并计算位

通过在循环中除以2,可以等效地实现这一点。但在我看来,计数会更有效率

如果从右边计数,则可以使用gmp\U scan0和gmp\U scan1。但是你必须以某种方式将混合的比特转换成所有的1和0

但是使用gmp_strval(num,2),您可以生成一个字符串并对其执行strpos

如果要转换整个值,可以对其执行(strlen-1)


显然,这只适用于需要整数日志的情况。

我最近遇到了一个非常类似的问题。。因此,我只是对这个数字进行了相当大的缩放,以便使用内置日志来查找小数部分。。(出于某种原因,我更喜欢log10……别问了……人们都很奇怪,我也是) 我希望这是不言自明的。。 它返回一个浮点值(因为这是我需要的)

很快,很脏。。。但是它工作得足够好,可以获得一些RSA大小的整数的日志;)

用法也很简单

$N = gmp_init("11002930366353704069");
echo gmp_log($N,10)."\n";
echo gmp_log($N,10, false)."\n";
echo gmp_log($N,2)."\n";
echo gmp_log($N,16)."\n";
返回

19.041508364472 
19 
63.254521604973 
15.813630401243

我最近遇到了一个非常类似的问题。。因此,我只是对这个数字进行了相当大的缩放,以便使用内置日志来查找小数部分。。(出于某种原因,我更喜欢log10……别问了……人们都很奇怪,我也是) 我希望这是不言自明的。。 它返回一个浮点值(因为这是我需要的)

很快,很脏。。。但是它工作得足够好,可以获得一些RSA大小的整数的日志;)

用法也很简单

$N = gmp_init("11002930366353704069");
echo gmp_log($N,10)."\n";
echo gmp_log($N,10, false)."\n";
echo gmp_log($N,2)."\n";
echo gmp_log($N,16)."\n";
返回

19.041508364472 
19 
63.254521604973 
15.813630401243

可能不是重复的,但非常接近这一点:Log适用于大数字,但它会失去精度。无论如何,对数可能返回无理数。在处理日志和任意数字时,无法处理精确的数字。您必须更具体。可能不是重复的,但非常接近于此:Log适用于大数字,但它会失去精度。无论如何,对数可能返回无理数。在处理日志和任意数字时,无法处理精确的数字。您必须更加具体。第一个属性应该是实现
log2
版本的
bignum
log2($num)=log10($num)/log10(2)
第一个属性应该是实现
log2
版本的
bignum
所需的全部内容:
log2($num)=log10($num)/log10(2)