数字的加和逆:减零或乘以-1

时间:2019-07-19 00:42:04

标签: cpu-architecture ieee-754

取数字-1*a0-a时,哪种方法更快?其中a是双精度货币。

1 个答案:

答案 0 :(得分:2)

两者都很糟糕,只需使用XOR或专用FP求反指令翻转符号位即可。

IEEE-754浮点使用符号/幅度表示,因此-xx的区别仅是1位:符号位。 (例如,在带有SSE的x86上,使用xorps How to negate (change sign) of the floating point elements in a __m128 type variable?)。这会将NaN翻转为-NaN,反之亦然,而无需更改有效载荷。

在C语言中,将其编写为-a ,然后查看编译器的作用。

更好的是,您通常可以通过稍后执行减法而不是加法或使用FMSUB或FNMADD而不是FMADD来优化否定,或者最初使用FNMSUB而不是FMADD产生a来求反FMA。


但是,如果您必须在实际的FP倍数或FP加法指令之间进行选择,通常减法的延迟至少与乘法一样好。

英特尔Haswell和Broadwell的乘法吞吐量是添加吞吐量的两倍(在具有更差或相等的延迟添加的FMA单元上运行),但是大多数微体系结构(包括现代x86 Ryzen和Skylake)的FP添加与乘法吞吐量保持平衡。

通常对于非x86体系结构,加法通常至少与乘法一样便宜。但是同样,大多数ISA将采用某种特殊的否定方式,例如x86的SSE1 xorps或旧版x87 fchs (CHange Sign)

布尔值AND或ANDN(或内置“掩码”的专用指令)无条件清除符号位也可用作绝对值。