我在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;
答案 0 :(得分:0)
同一基本函数的两个版本,例如pow()
,每个版本只需要精确到> 0.5ULP,有时会产生具有相同参数的不同结果。
C和C ++标准不对pow()
的准确性施加任何限制。正确的实现将尝试精确到1ULP,但这仍然留下答案不是最佳答案的可能性,并且与另一个1-ULP精确pow()
函数的答案不同。实际上,这个网站上的几个问题是由pow()
函数引起的,这些函数是准确的to more than 1ULP,但是它可能是丑陋的,尽管提供者可以使用不正确的函数。
因此,简而言之:如果使用pow()
,两个编译器之间的计算可能不同,尽管编译器具有相同的实现定义特征(int,endianness等的大小)。如果在数值不稳定的计算中使用pow()
,最终结果可能会有任意差异。
可重复结果的常用解决方案是提供您自己的pow()
功能。但是,如果差异是由数值不稳定的计算引起的,那么这并不能解决根本问题:现在可重现的结果可能仍然没有意义。