繁体   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

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

问题是:

给你 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但在条件检查中不匹配。

1 个回复

为什么 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 (来自数学分析)。

1 当指数为 integer 时,pow(x,p) 是否更快?

在使用pow(double x, double p)的代码中(大部分情况有p = 2.0 )我观察到,当p = 2.0时,我的代码的执行速度明显快于p = 2.000000001时。 我得出的结论是,在我的编译器(gcc 4.8.5)上, pow的实现会在运行时检测到它何时是正方形。 根据这个观察 ...

2020-04-22 06:55:24 2 120   c++/ c++03
3 实现 pow(x, n)

为什么当我尝试这个函数时给出错误答案-1而不是正确答案1 ? myPow(-1.00000, -2147483648) 我只是尝试运行下面的代码。 打印出“Hello World”。 这里我没有指定数据类型,但它仍然通过 if 语句。 为什么? if (-1 &gt; 2147483648) { ...

5 如何实现 pow(x) 和 sqrt(x)?

我试图寻找类似的答案,但没有找到任何东西。 所以就到这里了。 我目前的任务是使用 tkinter 工具在 Python 中创建一个带有 GUI 的简单计算器。 当我在实现 pow(x) 和 sqrt(x) 并让它们正常工作时遇到一些问题,我几乎完成了。 这是我用于操作数按钮的函数: 这适用 ...

6 相同的数组值不相等?

该脚本查找特定日期的最大值并将其保存到新数组$cache 但是,当检查同一天的最大值是否相等时,它返回false? 数组中的上述内容使我感到困惑。 难道不算是一场比赛吗? 输出: ...

7 看似相同的原始值不相等

一个奇怪的案例突然出现了。 两个对象的两个属性被转换为相同的基元类型,并且(看似)具有相同的值。 但是,相等比较器返回false 。 如果我们使用Equals方法(或比较这两个值的其他方法),那么我们得到正确的结果。 更奇怪的是,实际上将演员的结果放入一个新的变量似乎也有效。 ...

暂无
暂无

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

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