在C#中否定浮点值的最佳方法

时间:2017-05-30 17:58:28

标签: c# point floating negation

从代码执行的角度来看,更快的是:

double a = 1.234;
double minus_a = -a;

或:

double a = 1.234;
double minus_a = a * -1;

第二种情况是否实际执行浮点乘法?或者编译器是否足够智能以优化第二种情况与第一种情况相同?

1 个答案:

答案 0 :(得分:4)

使用.NET 4的64位JIT进行测试,其他JIT(例如旧的32位JIT或更新的RyuJIT)可能不同(实际上32位旧的JIT 必须做其他事情,因为它不使用SSE)

-x转换为

vmovsd      xmm1,qword ptr [00000050h] ; there's a -0.0 there, so only the sign bit is set
vxorpd      xmm0,xmm0,xmm1 ; literally flip the sign

x * -1进入

vmulsd      xmm0,xmm0,mmword ptr [00000048h] ; -1.0

是的,非常字面意义。

至于速度,您可以从here中选择您的模型并进行比较,但vxorpd总是会比vmulsd更快。

它是否已将x * -1优化为异或? NaN的行为是不同的,XOR方法会翻转NaN的符号,但这并不重要。