编译器的结果不同:(gcc 4.8.1)和gcc(4.3.2)

时间:2014-06-13 05:54:32

标签: c++ c gcc pow

我在C ++的不同编译器上为在线评判提交了相同的问题解决方案。在gcc(4.3.2)上,我得到了WA,而在gcc(4.8.1)上提交的相同解决方案得到了TLE。

4.3.2是否更快但我认为性能明智的最新版本应该优于以前的版本,或者它是两个编译器中的浮点异常,因为问题需要计算64位数的第n个根并且我使用的是长的具有pow功能的double和long long数据类型。我使用了类似的东西:

    long long root,n;
    long double rad,rcnd;
    root = (long long)pow(rad,rcnd); where rcnd = 1.0/n;

1 个答案:

答案 0 :(得分:0)

同一基本函数的两个版本,例如pow(),每个版本只需要精确到> 0.5ULP,有时会产生具有相同参数的不同结果。

C和C ++标准不对pow()的准确性施加任何限制。正确的实现将尝试精确到1ULP,但这仍然留下答案不是最佳答案的可能性,并且与另一个1-ULP精确pow()函数的答案不同。实际上,这个网站上的几个问题是由pow()函数引起的,这些函数是准确的to more than 1ULP,但是它可能是丑陋的,尽管提供者可以使用不正确的函数。

因此,简而言之:如果使用pow(),两个编译器之间的计算可能不同,尽管编译器具有相同的实现定义特征(int,endianness等的大小)。如果在数值不稳定的计算中使用pow(),最终结果可能会有任意差异。

可重复结果的常用解决方案是提供您自己的pow()功能。但是,如果差异是由数值不稳定的计算引起的,那么这并不能解决根本问题:现在可重现的结果可能仍然没有意义。