琐碎的问题:我只是想知道,如果一个人想要提高一个int或一个长期的另一个int或long的力量,
(long)std::pow((double)a,(double)b)
足够,或者我需要
(long)(0.5 + std::pow((double)a,(double)b))
答案 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的大值上溢出。