gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:21 24 4
gpt4 key购买 nike

从代码执行的角度来看什么更快:

double a = 1.234;
double minus_a = -a;

或:

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

第二种情况真的执行浮点乘法吗?或者编译器是否足够聪明,可以将第二种情况优化为与第一种情况相同?

最佳答案

使用 .NET 4 的 64 位 JIT 进行测试,其他 JIT,例如旧的 32 位 JIT 或较新的 RyuJIT 可能会有所不同(实际上,旧的 32 位 JIT 必须做一些其他事情,因为它不使用SSE),尽管 64 位核心 CLR 5.0 仍然做同样的事情。

-x 转化为

vmovsd      xmm1,qword ptr [00000050h] ; the constant is -0.0, 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 优化为 XOR 吗?或许。有一些古怪的情况,其中不做同样的事情,例如当 DAZ or FTZ are set 时(在非正规值的情况下,它们会影响 vmulsd 的操作,但 vxorps 会忽略这些标志,它始终是纯异或)。但是在 .NET 中没有使用这些功能的官方方法。

关于c# - 在 C# 中否定浮点值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44268892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com