如何在 C++ 中计算 int 或 long 的幂

发布于 2024-11-30 10:28:39 字数 221 浏览 4 评论 0原文

小问题:我只是想知道,如果一个人想将一个 int 或 long 提升到另一个 int 或 long 的幂,就

(long)std::pow((double)a,(double)b)

足够了,还是我需要

(long)(0.5 + std::pow((double)a,(double)b))

Trivial question: I am just wondering, if one wants to raise an int or a long to the power of another int or long, does

(long)std::pow((double)a,(double)b)

suffice, or do I need

(long)(0.5 + std::pow((double)a,(double)b))

?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

稚然 2024-12-07 10:28:39

有两个考虑因素。第一个是由于浮点表示的不精确性而导致的舍入;在这种情况下,这不会成为问题,因为只要位数小于浮点中有效数字的位数,整数就可以完美表示。如果 long 是 32 位,而 double 有效数是 53 位(通常如此),那么就不会有问题。

第二个考虑因素是 pow 函数本身的准确性。如果结果有可能低于实际值,则添加 0.5 对结果进行四舍五入是确保正确结果的唯一方法。

pow 的预期结果将始终是一个整数,因此添加 0.5 没有什么坏处。我会推荐那个版本。

There are two considerations. The first is roundoff due to inexactness of floating point representations; this won't be a problem in this case, because integers are perfectly representable as long as the number of bits is less than the bits of significand in the floating point. If long is 32 bits and double significand is 53 bits, as it usually is, there won't be a problem.

The second consideration is the accuracy of the pow function itself. If there's any possibility that it will come out lower than the actual value, adding 0.5 to round the result is the only way to ensure the proper result.

The expected result of your pow will always be an integer, so there's no harm in adding 0.5. I'd recommend that version.

安稳善良 2024-12-07 10:28:39

您应该编写自己的函数。这样您就可以自己处理溢出,并且不必担心舍入错误。

但在这两者中我会使用第二个。

You should write your own function. That way you can handle overflow yourself, and you don't have to worry about rounding errors.

But of the two I would use the second.

何止钟意 2024-12-07 10:28:39

第二个示例可能更合适,因为它将结果四舍五入到最接近的整数而不是截断它。

The second example may be more suitable as it rounds the result off to the nearest integer rather than truncates it.

十级心震 2024-12-07 10:28:39

为什么不直接使用循环呢?无论如何,整数乘法次数不能超过 31/63 次而不会溢出。

Why not just use a loop. There can't be more than 31/63 integer multiplications without overflow anyway.

假扮的天使 2024-12-07 10:28:39

第一个就足够了,但您需要在转换之前检查结果双精度值,因为它可能比 long 的最大值大得多。

First one would be sufficient but you need to check the result double value before casting since it can be pretty larger than long's max.

探春 2024-12-07 10:28:39

你的第一个例子是有效的。不过,为了清楚起见,最好使用 static_cast<>() 而不是 c 风格的强制转换。您发布的第二个示例对于较小的值会给出错误的结果,并且是多余的。

Your first example is valid. It would be best to use a static_cast<>() instead of a c-style cast for clarity however. The second example you posted would give an incorrect result for small values and is superfluous.

傾城如夢未必闌珊 2024-12-07 10:28:39

这样做应该足够了:

static_cast<long>(std::pow(static_cast<double>(a), b));

您应该意识到这会在 b 的较大值上溢出。

It should be sufficient to do:

static_cast<long>(std::pow(static_cast<double>(a), b));

You should realise that this will overflow on large values of b.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文