---
title: 编译器的差异
description: "不同的编译器执行相同的代码可能会产生不一样的计算结果，这主要是因为编译器在将源代码转换为目标代码时会进行不同的优化和转换，导致生成的机器码有所不同。这些优化和转换可能包括："
url: https://www.hikunpeng.com/document/detail/zh/perftuning/precisionopt/kunpengprecision_12_0009.html
sourcePath: /source/zh/perftuning/precisionopt/kunpengprecision_12_0009.html
indexId: e864405b50756d10ee7b92af9186680074030a87e81918465a1d115de97b546f64
---
# 编译器的差异

不同的编译器执行相同的代码可能会产生不一样的计算结果，这主要是因为编译器在将源代码转换为目标代码时会进行不同的优化和转换，导致生成的机器码有所不同。这些优化和转换可能包括：

- 编译器优化：编译器会尝试通过各种方式优化代码，例如消除不必要的计算、减少循环的迭代次数、内联函数等等。这些优化可能会导致生成的机器码不同，从而影响程序的计算结果。
- 编译器转换：不同的编译器可能会将源代码转换为不同的目标代码格式，例如不同的机器码格式或者不同的字节序。这些转换可能会导致生成的机器码不同，从而影响程序的计算结果。
- 编译器实现：不同的编译器可能会使用不同的实现方式来处理相同的语言特性，例如不同的编译器可能会使用不同的垃圾回收机制或者内存管理方式。这些实现方式可能会导致生成的机器码不同，从而影响程序的计算结果。

编译器对精度的影响主要体现在如下5个方面：

- 浮点数的精度是有限的。
- 每个编译器都有影响浮点运算结果的选项。

  - Intel针对乘加运算会进行特殊处理，简化为融合指令，简化的规则与毕昇存在差异。
  - Intel precise模式不符合标准。
  - ICC在-fp-model precise -O0/O1和-fp-model precise -O3两组编译配置下，SUMDP的计算结果会出现差异，这说明ICC的实现不符合精度标准。
  - 毕昇编译器对立即数常量的处理有问题，例如立即数0.002362E12被不同编译器读取到内存里就会不一致。对于未定义类型的立即数，其读取到内存的值在IEEE-754规范中未做具体定义，因此不同编译器的实现不同会导致该问题。
- 每个编译器的编译选项实现都不一样，导致产生的默认值也不一样。
- 有一些选项可以被看起来毫无关联的选项使能和禁用。
- 当两个平台都使用一致的选项，编译器可以确保误差范围可控。
