gpt4 book ai didi

C++ 双除法并返回

转载 作者:行者123 更新时间:2023-11-30 00:36:31 25 4
gpt4 key购买 nike

我知道 double 只是近似值。但令我惊讶的是

double f(int x, int y)
{
return double(x)/y;
}

double f(int x, int y)
{
double z = double(x)/y;
return z;
}

可以返回不同的值。有谁知道为什么吗?

最佳答案

“为什么”的主要原因是标准允许它(除了我不是 100% 确定它确实如此)。务实的原因是在某些处理器上(包括 Intel 32 位处理器),浮点寄存器比 double 更精确.中间计算在寄存器中完成,如果它们适合(标准明确允许中间结果有更精确),因此任何给定表达式的结果将取决于编译器如何管理其寄存器,以及何时溢出到内存中。许多(大多数?)这样的编译器处理器将在寄存器中返回浮点值,他们在那里保持额外的精度。 (我不确定这是合法的。分配双倍时,我认为复制时构造一个 double 值,必须使该值适合。回归一个值是复制构造,所以我认为它应该强制双适合。无论如何......大多数编译器都没有,所以你有处理它,不管标准可能或可能是什么不必多说。)

我认为你可以通过明确地转换最终的来防止这种情况结果,即:

return double( double(x)/y );

,但我不确定(无论是关于标准的内容它,也不是关于编译器实际做什么)。

注意结果是否不同取决于在某种程度上取决于您对它们的处理方式。如果你立即分配他们到double ,或将它们传递给另一个函数需要 double , 那么所发生的只是四舍五入稍后发生(但仍具有相同的值)。如果你使用表达式中的值,但是,所有赌注都关闭了。在你的案例,2.0 * f( a, b )可能会产生不同的值取决于您对 f 的实现,即使在四舍五入之后。最引人注目的是,f( a, b ) == f( a, b )可能会返回 false。(我见过这导致 std::sort 崩溃的案例。使用的比较函数做了一些类似的事情 return lhs.f() < rhs.f(); , 并返回 true什么时候lhsrhs是对同一对象的引用;编译器将它调用的第一个函数的结果溢出到内存中,然后与第二个函数返回的寄存器中的值进行比较。)

关于C++ 双除法并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834517/

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