p的正n根

Far*_*dli 0 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;
}
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 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.