- 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/
我想要以下内容: void foo( /* something representing a function f */, /* arguments a1, a2, etc. in s
简而言之,我想声明一个这样的特征: trait Test { def test(amount: Int): A[Int] // where A must be a Monad } 这样我就可以
在 GWT 中,如何在 onModuleLoad 方法中插入框架集以及相对嵌套的框架集和框架,以合并许多小程序和其他小部件和 HTML?代码片段是: 公共(public)类 MainEntryPoin
这个问题在这里已经有了答案: How do I best simulate an arbitrary univariate random variate using its probability
我对java相当陌生,并且习惯于枚举本质上只不过是一个命名的整数列表。 现在我正在编写一个实现,其中父类有几个采用枚举值作为参数的方法。枚举将在子类中定义,并且会略有不同。由于枚举基本上看起来像类,所
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
想象一下 6-7 台服务器的设置都完全相同Java 版本“1.6.0_18”OpenJDK 运行时环境 (IcedTea6 1.8) (fedora-36.b18.fc11-i386)OpenJDK
这个问题在这里已经有了答案: What are some uses of template template parameters? (10 个答案) 关闭 4 年前。 我有一个根据策略舍入值的函数
我正在寻找如何在 Java 中给定一个 Async CompletableFutures 列表,以便前 N 个中的任何一个成功完成或失败。除非没有 N 次成功,否则忽略任何失败。 有这方面的例子吗?
我面临的问题是项目已经使用集群编程来分配任务。 if (cluster.isMaster) { // Fork workers. for (var i = 0; i { }); } el
我正在为 Luxology modo(3D 和 VFX 应用程序)编写脚本,该脚本使用 python 作为脚本语言。在我的脚本中的某个位置,我正在读取从其他应用程序输出的文本文件,并从该文本文件的行创
这个问题在这里已经有了答案: Fast arbitrary distribution random sampling (inverse transform sampling) (5 个答案) 关闭
我只是遇到了一个问题,我有一个结构数组,例如 package main import "log" type Planet struct { Name string `json:"
我正在尝试将 class ResponseResult 编码为 json case class ResponseResult (var Code : Int, var
我想将一个矩阵中的一个 block 复制到另一个矩阵的一部分中。要将其与任何类型的 n 维数组一起使用,我需要通过 [] 运算符应用带有偏移量的列表。有办法做到这一点吗? mat_bigger[0:5
我有一个匹配一组数字和字母的正则表达式。但是我希望能够排除任何三个连续的字母。这是为了防止意外形成单词或缩写。 我的表达如下。它还排除了一些类似的字符,如 0、o、O 和 1、i、I、l): ^[2-
根据documentation . 应匹配任何字符,但不匹配重音字符。 mysql> select 'test' regexp 't.st'; +----------------------+ | '
我该如何用 JavaScript 编写这个 if 语句? if(url == "http://www.google.com/" && "*") { ... } * 需要灵活并接受添加到第一个变量上
我知道 cPython 有一个 GIL,因此如果不使用多处理模块,您的脚本就无法在多个内核上运行。但是有什么可以阻止内置功能,例如使用多核进行排序吗?我不了解 cPython 结构,但我想我要问的问题
寻找命令行 gdb 的替代方法来检查 OSX 上的核心转储 - 有没有办法让 Xcode 打开带有调试符号的任意核心转储? 最佳答案 您是否尝试过使用 MachOView 1? 听起来它可能适用于查看
我是一名优秀的程序员,十分优秀!