编译器处理数学有何不同?

时间:2017-06-13 15:10:57

标签: c++ visual-studio ide

我制作了一个代码,用于在给定点找到函数的导数。代码读取

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(精确没有小数点)

非常大的问题:

为什么不同的编译器会给出不同的结果?

1 个答案:

答案 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