Kam*_*lin 3 c++ logging logarithm arbitrary-precision
我必须找到非常大的日志.
我在C++中这样做
我已经做了乘法,加法,减法,除法的函数,但是对数存在问题.我不需要代码,我需要一个简单的想法如何使用这些函数来完成它.
谢谢.
PS抱歉,我忘了告诉你:我必须找到该号码的二进制对数
PS-2我发现在维基百科:
int floorLog2(unsigned int n) {
if (n == 0)
return -1;
int pos = 0;
if (n >= (1 <<16)) { n >>= 16; pos += 16; }
if (n >= (1 << 8)) { n >>= 8; pos += 8; }
if (n >= (1 << 4)) { n >>= 4; pos += 4; }
if (n >= (1 << 2)) { n >>= 2; pos += 2; }
if (n >= (1 << 1)) { pos += 1; }
return pos;
}
Run Code Online (Sandbox Code Playgroud)
如果我在大数字下重新制作,它会正常工作吗?
我假设你正在编写自己的bignum类.如果你只关心log2的整体结果,那很容易.记录非最重要数字的日志,并在该字节后添加8.这假设每个字节保持值0-255.这些仅在±.5范围内准确,但速度非常快.
[0][42][53] (10805 in bytes)
log2(42) = 5
+ 8*1 = 8 (because of the one byte lower than MSB)
= 13 (Actual: 13.39941145)
Run Code Online (Sandbox Code Playgroud)
如果您的值保持基数为10位数,那就可以了log2(MSB)+3.32192809*num_digits_less_than_MSB.
[0][5][7][6][2] (5762)
log2(5) = 2.321928095
+ 3.32192809*3 = 9.96578427 (because 3 digits lower than MSB)
= 12.28771 (Actual: 12.49235395)
(only accurate for numbers with less than ~10 million digits)
Run Code Online (Sandbox Code Playgroud)
如果您使用了维基百科上找到的算法,它将会非常缓慢.(但如果你需要小数,则准确)
它已经指出,我的方法是不精确的,当MSB为小(仍然在±0.5,但没有更远),但是这很容易通过简单地将顶部两个字节移位到单数,服用的对数固定即,和对小于该数字的字节进行乘法运算.我相信这将是半个百分点之内准确,仍然显著比正常快的对数.
[1][42][53] (76341 in bytes)
log2(1*256+42) = ?
log2(298) = 8.21916852046
+ 8*1 = 8 (because of the one byte lower than MSB)
= 16.21916852046 (Actual: 16.2201704643)
Run Code Online (Sandbox Code Playgroud)
对于10位基数,它是log2( [mostSignificantDigit]*10+[secondMostSignifcantDigit] ) + 3.32192809*[remainingDigitCount].
如果性能仍然存在问题,则可以使用log2的查找表,而不是使用完整的对数函数.
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |