【问题标题】:float point mul (*10) with adds and shifts带有加法和移位的浮点 mul (*10)
【发布时间】:2012-03-08 04:28:15
【问题描述】:

我的问题很简单:我可以通过 (2 << 2) + 2 进行移位和加法 2 * 10,但我不知道如何通过移位和加法获得 2.2 * 10。任何建议将不胜感激。

-khan_gl

【问题讨论】:

  • 如果你像我想的那样使用双精度或浮点数,你不能简单地使用。浮点数的二进制表示是一个标准的噩梦。如果你能处理定点数,那就简单了。
  • @BLUEPIXY: (x << 3) + (x << 2)x * 12,而不是 x * 012
  • 哦!错误。 (*10) 是 (x

标签: c++ c


【解决方案1】:

这行得通:

2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + (0 << 1)

开个玩笑,你不能,因为你不能在 C++/C 中移动浮点数。好吧,你可以(通过讨厌的类型双关语),但是你会陷入未定义的行为。

而且,这样做没有任何意义。如果你正在做乘法,那么只需使用*。编译器会将其转换为最有效的形式。

【讨论】:

  • 0 << 1 是干什么用的?我不认为它是 UB,标准要求移位运算符的整数操作数。
  • @Alex khan 想要在那里换班,所以我答应了;) UB 来自将浮点数转换为 int 以执行换档。
  • @Pubby:我没有看到未定义的行为。从floatint 没有cast(0 << 1) 的类型为 int,值为 0。结果从 int 隐式转换为 double(不是 float),生成 0.0。你发现了什么问题?
  • @KeithThompson 啊,猜猜它一定是类型双关语。我的例子不是为了展示 UB。
  • @Pubby:我想我明白你的意思了;你说的是*(unsigned*)&float_object << 1,当然是UB。我将更新您的答案以使其更清楚。
【解决方案2】:

如果我完全理解你的问题,

2.2 = 2 + 2/10

因此,2.2 * 10 = 2*10 + 2*10/10 = 2*10 + 2 = 22。

您可以使用移位和减法进行除法。

【讨论】:

    【解决方案3】:

    在现代 CPU 上,浮点数以称为“IEEE 754”的格式表示。

    IEEE 754 浮点运算的核心是位移和整数运算。如果你有耐心,你可以用 C 编写一个 IEEE 754 ALU 的简单实现。你可能会发现这个线程很有趣:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多