【问题标题】:Have there been attempts to represent floats with unsigned or signed integers? [closed]有没有尝试用无符号或有符号整数表示浮点数? [关闭]
【发布时间】:2013-12-14 21:04:56
【问题描述】:

我想知道是否有研究和尝试设计类浮点 (IEEE754) 类型,其中小数部分和整数部分分别由 intunsigned int 处理,或任何其他类型的设计这可能会导致使用整数实现类似浮点数。

我对一般性能、数值表示的有效范围等方面的研究特别感兴趣……以及您对此有何评论。

【问题讨论】:

  • 您在寻找更好的精度吗?
  • 当然这在历史上已经完成了。 (甚至在 1970 年我自己也做了一个版本,用于处理 IBM 7090 浮点值范围之外的数字。)但 IEEE 双精度“捕获”了大多数应用程序,其余的通常由某种“长十进制”处理类型。
  • 查看各种语言的 Decimal 数据类型的各种实现。这可以为您提供很多有趣的信息。
  • @BitFiddlingCodeMonkey 不,我真的不关心有符号浮点数,而且浮点计算通常很昂贵,我想知道是否有一种方法可以使用基于 less 的新类型使浮点更便宜昂贵的整数,甚至更好的无符号整数。
  • 同样,由于硬件支持,在大多数平台上没有什么比 IEEE 更“便宜”了。 (在某些情况下,浮点乘法/除法实际上比整数更快。)如果您确实需要在缺少 IEEE 的微控制器上提供类似的支持,那么执行您所描述的操作是有意义的。

标签: c++ c math integer ieee-754


【解决方案1】:

您是在寻找 fixed point 数字还是 decimal floating points ?在 gcc 中甚至还有它们的实现。另请参阅 these 有关十进制算术的资源。

【讨论】:

  • 是的,我想是的,经过一点挖掘,我认为正确的“关键字”就是那个,看起来这种方法也会有新的生命,因为有一个提案用于定点数学的下一个 C++1y 标准。
【解决方案2】:

是的,尤其是在 CPU 中没有浮点单元的旧技术中。在某些情况下,如果您确切知道这些值,您可以使用这种方法在这些平台上获得一些速度。然而,这种做法现在并不常见,而且这种做法在很久以前就已经消失了。 我已经看到它主要用于性能至关重要的游戏中。 这种技巧属于一种奇怪的优化实践,你自己编写 sqrt ,或者你自己的 float->int 转换函数。

【讨论】:

  • 它死了是因为程序员懒惰还是因为某种特殊原因?
  • @user2485710 不,这是因为硬件变得更好,你无法击败那里的硬件。
  • 你能说出几个平台,这样我就有机会获得有关这些平台及其浮点表示的文档吗?
  • @user2485710 我不能确定,我没有活过那个时代,我认为第一个游戏男孩没有浮点单元。无论如何,您应该寻找至少 15 年以上的技术
  • 在移动设备上还是很常见的。
【解决方案3】:

I asked this on comp.arch some time ago and got some really good answers,从 Dr. Mashey 开始:

|> 我想知道是否将所有 FP 空间用于另外三个或
|> 四个整数单元并为每个模型提供手动调整的 FP 库将
|> 为自己买单,但我一直认为如果可以这样做
|> 付钱,设计师会做的。也许现在超标量是
|> 一天的顺序,很快就会完成。

1) FP 硬件在那里,因为如果您关心 FP 性能,
总而言之,用典型
模拟所需的行为是非常困难的 以合理的速度进行整数运算。这些天,典型
FP add/mul 是 ~2-3 个时钟延迟,具有 1 个周期的重复率。

2) 当然,在微处理器方面有丰富的经验
在没有 FP 单元的情况下提供图书馆来做 FP 的人的世界,
适用于预计不经常使用 FP 的系统,或者
FP 协处理器尚不可用。这是真的
X86s、68KS 和 MIPS 等。以 MIPS 为例:
(a) 有些系统本身带有 R2000。
(b) 然后是一块大协处理器板。
(c) 最后,R2010 FPU 出来了,而且速度相当快,大多数
系统同时具有 R2000 和 R2010。在嵌入式市场,有
没有 FPU 的 CPU 仍然有很多用途。

3) 换一种说法:对于任何竞争对手:这确实是一个很酷的想法
删除硬件 FP 并通过整数操作进行模拟 :-)

【讨论】:

  • 谢谢,我去看看
  • 作为对这篇文章的评论,我还应该说,ARM 世界中对 FPU 的硬件支持是最近才发现的,特别是如果我们考虑到整个硬件+内核对。
【解决方案4】:

您要问的一个例子是“定点”算术。如果您注意到在位置系统中小数点在哪里并不重要,只要您正确跟踪它,您就可以决定将小数点保留在特定位置。这是我想说的一个例子,以 10 为基数: 123 + 456 = 579 1.23 + 4.56 = 5.79

嗯,你可以在 base 2 中做同样的事情。决定你的点应该在哪里并进行操作。回到 8088 和 IBM PS/2 8086 时代,我让我的汇编语言和 C++ 学生以这种方式绘制一个简单的 Mandelbrot 集。如果您将自己限制在 CPU 寄存器的大小但比模拟的浮点库快得多,那么精度会很差。

这个网站好像有更详细的信息:http://x86asm.net/articles/fixed-point-arithmetic-and-tricks/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2010-09-19
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    相关资源
    最近更新 更多