![]() |
1
19
Java Number Cruncher: The Java Programmer's Guide to Numerical Computing 提供使用 Newton's Method . 书中的源代码可用 here . 以下内容摘自第章 12.5大除数函数 (第330页和第331页):
|
![]() |
2
8
一个适用于大数字的黑客小算法使用关系式
|
![]() |
3
5
这是一个超级快,因为:
一次通话大约需要20微秒(大约每秒5万次通话) 但是:
解决问题
该算法利用对数可以作为指数和尾数的对数之和来计算。如: 12345有5个数字,因此以10为基数的日志介于4和5之间。 对数(12345)=4+对数(1.2345)=4.09149…(基10日志) 此函数计算基2日志,因为查找占用位的数目很简单。
|
![]() |
4
4
你可以用
基本上
或者你可以使用一些数学技巧-例如,接近1的数字的对数可以通过级数展开计算出来。
根据你试图取对数的类型,可能会有这样的数字你可以使用。
编辑
:要获得以10为底的对数,可以将自然对数除以
|
![]() |
5
4
这就是我想到的:
|
![]() |
6
3
一个Java实现的MeWOR68伪代码,我用几个数字测试:
|
![]() |
7
2
做对数的伪代码算法。 假设我们想要x的对数
大的while循环可能看起来有点混乱。 在每次传递中,您可以将输入平方,也可以取基数的平方根;无论哪种方法,您都必须将分数除以2。我发现将输入平方化,而不使用基数,这样更准确。 如果输入值变为1,我们就通过了。对于任何基,1的日志都是0,这意味着我们不需要再添加任何内容。 如果(结果+分数)不大于结果,那么我们的编号系统就达到了精度的极限。我们可以停下来。 显然,如果您使用的是一个精度任意多个数字的系统,那么您需要在其中放入其他东西来限制循环。 |
![]() |
8
2
如果您只需要在您可以使用的数字中找到10的幂:
|
![]() |
9
1
我在寻找这个确切的东西,最后用一个连续的分数方法。连分数可以在 here 或 here 代码:
|
![]() |
10
1
老问题,但我认为这个答案更可取。它具有良好的精度,支持几乎任何大小的参数。
核心逻辑(
|
![]() |
11
0
我为biginteger创建了一个函数,但是可以很容易地为bigdecimal修改它。分解日志并使用日志的一些属性是我所做的,但我只得到双倍精度。但它适用于任何基地。:)
|
![]() |
MighTy · 将字符串数组转换为列表<BigDecimal> 2 年前 |
![]() |
ema · Java中如何将整数转换为bigdecimal 6 年前 |
![]() |
smeeb · Java 8 BigDecimal乘法在反转时丢失精度 7 年前 |
![]() |
angrycrab · 执行涉及非终止大小数的算术 7 年前 |
![]() |
BenjaminJC · 对作为扫描仪输入的大小数进行验证 7 年前 |
![]() |
Yakhoob · 使用Java检查两个大十进制值之间的百分比 7 年前 |