【问题标题】:Left shift Float type左移浮点型
【发布时间】:2012-03-08 02:27:37
【问题描述】:

尝试执行时遇到编译器错误

float_val=float_val<<1;

它给出一个错误说“错误C2296:'

不能 v 左移浮点变量吗?为什么会这样?

【问题讨论】:

标签: c floating-point floating-point-conversion


【解决方案1】:

您不能左移float 变量,因为 (a) 您的 FPU 通常不会有桶形移位器暴露给您,因此物理上无法生成代码来执行此操作,以及 (b) 它甚至意味着什么?底层位表示由多个具有不同含义的字段组成,您真的希望这些位相互渗透吗?

如果您想将该变量中保存的数字乘以 2,则应该这样做。

如果您想将浮点数重新解释为左移有意义的某种类型(例如,适当大的无符号整数类型)对于像 Carmack 的平方根这样可怕的位黑客,那么您也可以这样做,但在现代硬件上您不太可能真的需要:认真考虑是否有更好的方法来做您想做的事。

【讨论】:

  • +1。但为了迂腐,FPU 几乎肯定有一个桶形移位器,因为它几乎是进行浮点加法所必需的。
  • @Oli:但即使你可以控制它,它也没有连接到移动整个浮点数,只是尾数......我会澄清一下。
  • 没关系,你的回答已经很好了。我只是一个刻板的书呆子!
  • 在 amd64 上,FP 数学通常在 SSE 寄存器中完成。没有什么能阻止您在这些寄存器上使用整数左/右移位。 (除了结果对任何事情都没有用处!)
【解决方案2】:

如果您想快速将浮点数乘以或除以 2 的幂,请查看标准函数 ldexpf。显然有点晦涩 :-)。

https://linux.die.net/man/3/ldexpf

【讨论】:

    【解决方案3】:

    移位浮点数没有意义,因为它表示为符号位、指数和尾数的串联。由于移位操作是关于移位,它意味着将位从尾数移位到指数和/或符号位。

    【讨论】:

      【解决方案4】:

      浮点数在值表示级别没有位,这就是为什么不能对它们应用按位运算的原因。

      更多信息请参见this answer

      【讨论】:

        【解决方案5】:

        由于左移运算符被定义为乘以 2 的幂,因此它对浮点类型非常有意义。但是,C 语言没有定义它的用途,因此您必须使用 scalbn 函数或类似函数。

        【讨论】:

          【解决方案6】:

          float 类型的对象不能左移。

          C 表示移位运算符的操作数应为整数类型。

          【讨论】:

            【解决方案7】:

            您必须先将浮动转换为其他东西。如:

            float f = 128;
            f = (float) (((int) f) << 1 );
            

            在上面,f 应该是 256.0。

            现在,如果您从 128.4 开始,显然这是有问题的,因为演员表会放弃 .4。您可能不想首先使用浮点数。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-24
              • 2020-12-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多