我制作了一个代码,用于在给定点找到函数的导数。代码读取
for line in soup.findAll("article", {"id" : "wh_adition_FakeAd1"}):
print line
现在我的学院使用turbo C ++作为它的IDE和编译器,而在家里我有视觉工作室(因为TC ++在900p屏幕上看起来非常糟糕但是开玩笑)。当我在大学电脑上尝试类似的程序时,结果非常混乱,并且不如我在家里得到的那么准确。例如:
示例:
x = 3
@College result = 18.something
@Home result = 18(精确没有小数点)
x = 1
@College result = 6.000 ..... something
@Home result = 6(精确没有小数点)
非常大的问题:
为什么不同的编译器会给出不同的结果?
答案 0 :(得分:0)
我90%肯定在两种情况下结果都是一样的,你看到差异的唯一原因是不同的输出格式。 对于64位IEEE双数学,这些计算的精确结果可能分别为17.9999997129698385833762586116790771484375和6.0000000079440951594733633100986480712890625。
如果您想验证该假设,可以用这种方式打印双倍值:
void printDoubleAsHex( double val )
{
const uint64_t* p = (const uint64_t*)( &val );
printf( "%" PRIx64 "\n", *p );
}
并确认两个编译器中的输出相同。
然而,你的两个编译器确实以结果不同的方式编译代码的可能性也有10%。并非罕见,甚至可以使用相同的编译器但不同的设置/标志/选项。
最可能的原因是不同的指令集。默认情况下,许多现代编译器为您的代码生成SSE指令,较旧的生成器遗留x87代码(x87在堆栈上的80位浮点值上运行,SSE在32或64位FP值上运行在这些向量寄存器上,因此精度的差异)。另一个原因是不同的舍入模式。另一个是编译器特定的优化,例如Visual C ++中的/fp。