琐碎的问题:我只是想知道,如果一个人想将一个 int 或 long 提升到另一个 int 或 long 的幂,是否
(long)std::pow((double)a,(double)b)
够了,还是我需要
(long)(0.5 + std::pow((double)a,(double)b))
?
有两个考虑。第一个是由于浮点表示不精确而导致的舍入;在这种情况下这不会成为问题,因为只要位数小于浮点中的有效位数,整数就可以完美表示。如果long
是 32 位,double
有效位是 53 位,通常是这样,不会有问题。
第二个考虑是pow
函数本身的准确性。如果有任何可能低于实际值,则将结果加 0.5 是确保正确结果的唯一方法。
您的预期结果pow
将始终是整数,因此添加 0.5 没有害处。我会推荐那个版本。
您应该编写自己的函数。这样您就可以自己处理溢出,而不必担心舍入错误。
但是在这两个中,我会使用第二个。
第二个示例可能更合适,因为它将结果四舍五入到最接近的整数而不是截断它。
为什么不只使用循环。无论如何,不能有超过 31/63 的整数乘法而不会溢出。
第一个就足够了,但您需要在转换之前检查结果双精度值,因为它可能比 long 的最大值大得多。
你的第一个例子是有效的。然而,为了清楚起见,最好使用 astatic_cast<>()
而不是 c 风格的演员表。您发布的第二个示例对于小值会给出不正确的结果,并且是多余的。
这样做就足够了:
static_cast<long>(std::pow(static_cast<double>(a), b));
您应该意识到这将在 b 的较大值上溢出。