4

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

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

够了,还是我需要

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

?

4

7 回答 7

5

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

第二个考虑是pow函数本身的准确性。如果有任何可能低于实际值,则将结果加 0.5 是确保正确结果的唯一方法。

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

于 2011-08-17T14:13:25.813 回答
3

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

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

于 2011-08-17T14:04:21.307 回答
3

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

于 2011-08-17T14:06:39.167 回答
2

为什么不只使用循环。无论如何,不​​能有超过 31/63 的整数乘法而不会溢出。

于 2011-08-17T14:15:38.190 回答
1

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

于 2011-08-17T14:03:50.827 回答
0

你的第一个例子是有效的。然而,为了清楚起见,最好使用 astatic_cast<>()而不是 c 风格的演员表。您发布的第二个示例对于小值会给出不正确的结果,并且是多余的。

于 2011-08-17T14:03:39.250 回答
0

这样做就足够了:

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

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

于 2011-08-17T14:06:23.583 回答