- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是我得到的
function bcln($n, $scale=10) {
$iscale = $scale+3;
$result = '0.0';
$i = 0;
do {
$pow = (1 + (2 * $i++));
$mul = bcdiv('1', $pow, $iscale);
$fraction = bcmul($mul, bcpow(bcsub($n, '1', $iscale) / bcadd($n, '1.0', $iscale), $pow, $iscale), $iscale);
$lastResult = $result;
$result = bcadd($fraction, $result, $iscale);
} while($result !== $lastResult);
return bcmul('2', $result, $scale);
}
但这需要 5.7 秒来运行 bcln(100)
(100 的自然对数,小数点后 10 位)。此外,对于更多的小数位,它并不总是准确的。有没有更好的算法?
对于该特定运行,需要 573 次迭代才能确定结果。
最佳答案
您需要一个任意长度的字符串作为答案吗?还是您需要任意 精度或任意 指数大小?或者…… double float 答案(返回值)就足够了吗?考虑到我们“仅”使用多个“任意”大小的对数?
double float 有一个 11 位有符号指数:因此,如果您的大数字字符串的长度≤1022 位≈307 个十进制数字(因此字符串长度为 306 个字符,包括小数点),您是安全的!更准确地说,如果所得十进制指数的绝对值≤307,则应该是安全的。你需要比这更大的指数吗? (我想换句话说:你是在处理现实世界的数字还是理论/纯数学?)
为什么不只使用一些字符串处理以及一些简单的浮点对数运算呢?这应该非常快,对于任何真实世界的数字......
function bclog10($n){
//←Might need to implement some validation logic here!
$pos=strpos($n,'.');
if($pos===false){
$dec_frac='.'.substr($n,0,15);$pos=strlen($n);
}else{ $dec_frac='.'.substr(substr($n,0,$pos).substr($n,$pos+1),0,15);
}
return log10((float)$dec_frac)+(float)$pos;
}
您可以使用一些众所周知的对数算法转换基数:
function bclogn($n,$base=M_E){//$base should be float: default is e
return bclog10($n)*log(10)/log($base);
}
我已经测试了这些函数,它们对我有用,对于我提供的示例;给出与 Windows 10 计算器完全相同的答案,达到 PHP 使用的 double 算术的限制。
如果您实际上需要超过 15 位的精度和超过 307 位的十进制指数,您可以实现您自己的“BigFloat”类对象,并以某种方式从标准的内置浮点构建它的方法-点函数使用分而治之的方法!然后,也许我们可以将其与上述功能/技术相结合,以此作为任意精度浮点对数算法的基础。您可能需要考虑咨询 math.stackexchange.com 的人员。 , 以进一步了解这是否是一种可行的方法。
主要编辑:第二次尝试......
function bclog10($n){//By Matthew Slyman @aaabit.com
$m=array();// ↓ Validation, matching/processing regex…
preg_match('/^(-)?0*([1-9][0-9]*)?(\.(0*))?([1-9][0-9]*)?([Ee](-)?0*([1-9][0-9]*))?$/',$n,$m);
if(!isset($m[1])){throw new \Exception('Argument: not decimal number string!');}
$sgn=$m[1];if($sgn==='-'){throw new \Exception('Cannot compute: log(<⁺0)!');}
$abs=$m[2];$pos=strlen($abs);
if(isset($m[4])){$fre=$m[4];}else{$fre='';}$neg=strlen($fre);
if(isset($m[5])){$frc=$m[5];}else{$frc='';}
if(isset($m[7])){$esgn=$m[7]==='-'?-1:1;}else{$esgn=1;}
if(isset($m[8])){$eexp=$m[8];}else{$eexp=0;}
if($pos===0){
$dec_frac='.'.substr($frc,0,15);$pos=-1*$neg;
}else{ $dec_frac='.'.substr($abs.$fre.$frc,0,15);
}
return log10((float)$dec_frac)+(float)$pos+($esgn*$eexp);
}
关于php - 使用 bcmath 的快速任意精度对数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945193/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!