取数字-1*a
或0-a
时,哪种方法更快?其中a
是双精度货币。
答案 0 :(得分:2)
两者都很糟糕,只需使用XOR或专用FP求反指令翻转符号位即可。
IEEE-754浮点使用符号/幅度表示,因此-x
与x
的区别仅是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(或内置“掩码”的专用指令)无条件清除符号位也可用作绝对值。