gpt4 book ai didi

c++ - c++ 中的 float a = -a 和 a *= -1 之间有区别吗?

转载 作者:行者123 更新时间:2023-12-03 23:01:19 25 4
gpt4 key购买 nike

对于诸如 signed int 和 float 和 double 等类型?因为,如果我没记错的话(一个非常大的 if),这是一个稍微翻转的问题,我想是否有一个显式操作可以使代码运行得更快?
编辑 : 好吧,只是对于浮点类型,int 部分是我忘记用我的大脑,抱歉)

最佳答案

-aa * -1是不同的操作。1 C++ 标准中没有任何内容明确要求实现为它们产生不同的结果,因此编译器可能会将它们视为相同。 C++ 标准中没有任何内容要求实现以相同的方式对待它们,因此编译器可能会以不同的方式对待它们。
C++ 标准在指定浮点运算方面非常松懈。 C++ 实现可以考虑一元 -进行数学运算,使得 -a相当于 0-a .另一方面,C++ 实现可以考虑一元 -成为 IEEE-754 否定 (x) 操作,根据 IEEE 754-2008 5.5.1:

negate(x) copies a floating-point operand x to a destination in the same format, reversing the sign bit. negate(x) is not the same as subtraction(0, x)…


差异包括:
  • 否定是位级操作;它翻转符号位,即使操作数是信号 NaN 也不发出异常信号,并且可能传播非规范编码(与十进制格式相关)。
  • 减法和乘法是数学运算;它们将发出异常情况的信号,并且不会传播非规范结果。

  • 因此,您可能会发现编译器为 a = -a; 生成 XOR 指令。仅翻转符号位,但为 a *= -1; 生成乘法指令.它应该为 a *= -1; 生成一个 XOR 指令。仅当实现不支持浮点标志、陷阱、信号 NaN 或任何其他使否定和减法/乘法可区分的东西时。
    Godbolt shows that x86-64 Clang 11.0.0默认选项使用 xor-amulssa * -1 .但是 x86-64 GCC 10.2用途 xorps对彼此而言。
    脚注
    1 我已经隔离了 -*在这里操作;分配部分不感兴趣。
    2 “信号”在此处用于 IEEE-754 意义,表示给出异常情况发生的指示。这可能会导致出现标志,并可能导致影响程序控制的陷阱。它与 C++ 信号不同,尽管陷阱可能会导致 C++ 信号。

    关于c++ - c++ 中的 float a = -a 和 a *= -1 之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65558590/

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