如果输入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 ,在很长时间后返回双。而且,到的两倍到长的转换可能会受到精度损失的影响。
这就是我拆卸程序时得到的。看起来编译器做得很神奇(技术上称为优化)。
左边的程序是第一个程序,右边的程序是第二个程序。
程序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/