p的正n根

时间:2015-09-25 10:31:34

标签: c++ math

以下代码在20个测试用例中打印错误答案。如果有人能找到逻辑错误,我会感激。

#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
using namespace std;

int main() {
    double n, p;
    cin >> n >> p;
    int k = pow(p, 1 / n);
    cout << k;
    return 0;
}

1 个答案:

答案 0 :(得分:5)

问题表明p ≤ 10^100。对于该量级的所有整数(*),没有精确的double表示。如果p的最近浮点表示小于精确p,则pow(p, 1 / n);返回的浮点值也将小于预期的k

转换浮点数时,小数部分会被截断,即数字向下舍入。因此,如果计算的浮点值k'小于精确的k,则转换为整数的k'将为k - 1

由于您可以保证得到一个接近正确整数的浮点数一小部分误差,您可以通过四舍五入到最接近的整数来解决问题,而不是向下舍入。 JSF已经为此提供了算法:在向下舍入之前添加0.5

(*)64位IEEE 754浮点数可以表示最多10 ^ 17的整数。

此外,存在结果大小的潜在问题。如果平台上的大小int是2个字节,那么k将溢出。对于int的给定范围,4字节k就足够了。您可以使用int32_t确保所需的尺寸。