如何在C ++中将int或long提升为幂

时间:2011-08-17 14:00:19

标签: c++ pow

琐碎的问题:我只是想知道,如果一个人想要提高一个int或一个长期的另一个int或long的力量,

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

足够,或者我需要

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

7 个答案:

答案 0 :(得分:5)

有两个注意事项。由于浮点表示的不精确性,第一个是舍入;在这种情况下,这不会成为问题,因为只要位数小于浮点中有效位的位数,整数就可以完美表示。如果long是32位且double有效数是53位,那么通常就不存在问题。

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

pow的预期结果将始终为整数,因此添加0.5无害。我推荐那个版本。

答案 1 :(得分:3)

你应该编写自己的功能。这样你就可以自己处理溢出,而且你不必担心舍入错误。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

第一个就足够了,但你需要在施法前检查结果的双倍值,因为它可能比长的最大值大。

答案 5 :(得分:0)

你的第一个例子是有效的。但是,为了清晰起见,最好使用static_cast<>()而不是c风格的演员表。您发布的第二个示例会为小值提供不正确的结果,这是多余的。

答案 6 :(得分:0)

这样做应该足够了:

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

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