非常非常大数的对数
我必须找到非常大的数字的日志。
我在C++中这样做
我已经制作了乘法,加法,减法,除法的函数,但是对数存在问题。我不需要代码,我需要一个简单的想法如何使用这些函数来做到这一点。
谢谢。
聚苯乙烯 抱歉,我忘了告诉你:我必须找到该数字的仅二进制对数
P.S.-2 我在 Wikipedia 中发现:
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;
}
如果我在大数字下重新制作它,它会正常工作吗?
I have to find log of very large number.
I do this in C++
I have already made a function of multiplication, addition, subtraction, division, but there were problems with the logarithm. I do not need code, I need a simple idea how to do it using these functions.
Thanks.
P.S.
Sorry, i forgot to tell you: i have to find only binary logarithm of that number
P.S.-2
I found in Wikipedia:
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;
}
if I remade it under the big numbers, it will work correctly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我假设您正在编写自己的 bignum 类。如果你只关心log2的积分结果,那很简单。取非零的最高有效数字的对数,并为该数字之后的每个字节添加 8。假设每个字节保存值 0-255。这些精度仅在 ±.5 以内,但速度非常快。
如果您的值以 10 为基数,则结果为
log2(MSB)+3.32192809*num_digits_less_than_MSB
。如果您使用在维基百科上找到的算法,它会非常慢。 (但如果您需要小数,则准确)
有人指出,当 MSB 很小时(仍在 ±.5 内,但不能再远),我的方法不准确,但是只需将前两个字节移至单个数字即可轻松解决此问题,取那个的对数,并对小于该数字的字节进行乘法。我相信这将在半个百分点内准确,并且仍然比正常对数快得多。
对于 10 基数,它是
log2( [mostSignificantDigit]*10+[secondMostSignifcantDigit] ) + 3.32192809*[remainingDigitCount]
。如果性能仍然是一个问题,您可以使用 log2 的查找表,而不是使用完整的对数函数。
I assume you're writing a bignum class of your own. If you only care about an integral result of log2, it's quite easy. Take the log of the most significant digit that's not zero, and add 8 for each byte after that one. This is assuming that each byte holds values 0-255. These are only accurate within ±.5, but very fast.
If your values hold base 10 digits, that works out to
log2(MSB)+3.32192809*num_digits_less_than_MSB
.If you used the algorithm you found on wikipedia, it will be IMMENSELY slow. (but accurate if you need decimals)
It's been pointed out that my method is inaccurate when the MSB is small (still within ±.5, but no farther), but this is easily fixed by simply shifting the top two bytes into a single number, taking the log of that, and doing the multiplication for the bytes less than that number. I believe this will be accurate within half a percent, and still significantly faster than a normal logarithm.
For base 10 digits, it's
log2( [mostSignificantDigit]*10+[secondMostSignifcantDigit] ) + 3.32192809*[remainingDigitCount]
.If performance is still an issue, you can use lookup tables for the log2 instead of using a full logarithm function.
我假设您想知道如何“手动”计算对数。所以我告诉你我为此发现了什么。
查看此处< /a>,其中描述了如何手动对数化。您可以将其实现为算法。 这里是“Euler 是如何做到的”的文章。我还发现这篇文章很有希望。
我想有更复杂的方法可以做到这一点,但它们太复杂,您可能不想实现它们。
I assume you want to know how to compute the logarithm "by hand". So I tell you what I've found for this.
Have a look over here, where it is described how to logarithmize by hand. You can implement this as an algorithm. Here's an article by "How Euler did it". I also find this article promising.
I suppose there are more sophisticated methods to do this, but they are so involved you probably don't want to implement them.