gpt4 book ai didi

c++ tgamma() 函数有不同的输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:56 25 4
gpt4 key购买 nike

如果输入 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用于测试

最佳答案

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

这是我在反汇编程序时得到的。看起来编译器施展了魔法(技术上称为优化)。

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

Program 1 vs. Program 2

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

程序 1 中发生了什么?

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

程序 2 第 44 行: [cvttsd2siq] Convert Scalar Double-Precision Floating-Point Value to Signed Doubleword Integer with Truncation 的汇编级指令

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

剧透:只需在 long 中使用 double 即可避免此错误。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com