---
title: GCC编译器优化浮点运算精度
description: "编译优化选项设置-O2级别及以上时，鲲鹏处理器将对连续的浮点数乘法、加法融合为乘加运算，以提升性能和精度。在-O2级以上编译选项下，x86处理器不会将乘法和加法做融合乘加运算，因此两种处理器在连续的浮点数乘法、加法运算后，小数点后16位存在差异。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0040.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0040.html
indexId: 858f75136f19205dcfe64a833745deb11035c00e7c716377396a44a33e2fa1a165
---
# GCC编译器优化浮点运算精度

#### 现象描述

编译优化选项设置-O2级别及以上时，鲲鹏处理器将对连续的浮点数乘法、加法融合为乘加运算，以提升性能和精度。在-O2级以上编译选项下，x86处理器不会将乘法和加法做融合乘加运算，因此两种处理器在连续的浮点数乘法、加法运算后，小数点后16位存在差异。


#### 问题原因

在鲲鹏处理器上，编译优化选项设置为-O2级别及以上时，连续的浮点数乘法（fmul指令）和加法（fadd指令）运算，如表达式：(a+=b*c)，将被融合为乘加运算（fmadd指令）。fmadd将浮点数的乘法和加法看成不可分的一个操作，不对中间结果做精度舍入，从而导致计算结果有所差别。


#### 对系统的影响

编译优化选项设置-O2级别及以上时，浮点乘加运算的性能有提升，但是运算的精度受到影响。


#### 处理步骤

添加编译选项-ffp-contract=off可以关闭该优化。
