繁体   English   中英

为什么 pow(x,1/p) 和 pow(x,1.0/p) 不相等,即使打印它们的值会给出相同的结果

[英]Why are pow(x,1/p) and pow(x,1.0/p) not equal even though printing their values gives the same result

问题是:

给你 2 个数字(N,M); 任务是找到 N√M(M 的第 N 个根)。

输入:

输入的第一行包含一个 integer T 表示测试用例的数量。 然后是 T 测试用例。 每个测试用例包含两个空格分隔的整数 N 和 M。

Output:

对于每个测试用例,如果根是 integer,则在新行中打印 integer 表示 M 的第 N 个根,否则打印 -1。

现在我对这个问题的解决方案是:

#include <math.h>
#include <iostream>
#include <math.h>
using namespace std;

int main() {
    int t;
    float x, p;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        cin>>p>>x;
        if(p==0)
        {
            cout<<"1"<<endl;

        }
        
        else
        {
            float res=pow(x,(1/p));
            cout<<"res="<<res<<endl;
            if(res==int(res))
                cout<<res<<endl;
            else
                cout<<"-1"<<endl;
        }    
    }
    return 0;
}

这在测试用例中导致了一个问题:

1
3
1000

虽然当我打印res时,结果是10 ,但在条件检查期间if(res==int(res))被证明是假的。

我还注意到从float res=pow(x,(1/p)); float res=pow(x,(1.0/p)); 给出了正确的答案。 我猜它与完成1/p评估时获得0.33333有关,但我不明白为什么打印的值为10但在条件检查中不匹配。

为什么 pow(x,1/p) 和 pow(x,1.0/p) 不相等,即使打印它们的值会给出相同的结果(?)

计算因精度而异。 计算在数学上并不精确: pow()没有收到精确的1/3。

使用float p1/p可以与1.0/p不同,因为第一个是使用float (或更宽)数学完成的,第二个使用double (或更宽),因为 1.0 是一个double

这反过来又调用了floatdouble pow() 因此,可能存在不同的res结果。

在 OP 的情况下: pow(1000.0f,(1/3.0f))执行float精度计算,类似于pow(1000, near_one_third)而不是cbrt(1000.0) - 结果不完全是10.0f pow(1000.0f,(1.0/3.0f))执行了类似的double精度计算,当四舍五入到float时正好是10.0f

为什么打印的值为 10 但在条件检查中不匹配。

如果res的计算值大于或小于10.0f ,则==不正确。

以足够的精度打印以查看最终 output 的差异。 建议float res至少有 9 个有效数字。


至少,我建议始终使用相同的浮点类型和数学。 (使用 1.0f 和float 。)进一步推荐使用double

不过,最终输出可能仍然不是pow()的确切预期 integer (来自数学分析)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM