如果输入n = 6,则此代码返回719

int main()
    {
        long n,k;
        cin>>n;
        k = tgamma(n+1);
        cout<<k;
    }

而下面的代码将返回正确的答案720
int main()
{
    long n,k;
    n=6;
    k = tgamma(n+1);
    cout<<k;
}

为什么会这样呢?

我正在使用cpp.sh进行测试

最佳答案

根据cppreference std::tgamma 在很长时间后返回双。而且,的两倍到长的转换可能会受到精度损失的影响。

这就是我拆卸程序时得到的。看起来编译器做得很神奇(技术上称为优化)。

左边的程序是第一个程序,右边的程序是第二个程序。

c&#43;&#43; - C&#43;&#43; tgamma()函数具有不同的输出-LMLPHP

程序2第33行:编译器已经进行了计算,找到tgamma(6 + 1)的值为720。编译器实际上应用了该值并简化了表达式。

程序1中会发生什么?

程序2第42行: [cvtsi2sdq]用于将Doubleword整数转换为标量 double 浮点值的汇编级指令

程序2第44行: [cvttsd2siq]汇编级指令,用于将标量 double 浮点值转换为带截断的带符号双字整数

第二次提到的转换应该导致类型转换精度损失,从而导致意外值719(从719.9299328截断)。

SPOILER:只需长时间就地使用double即可避免此错误。

关于c++ - C++ tgamma()函数具有不同的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38017842/

10-11 21:18