【问题标题】:How are large and small Floating point values represented with Fixed point大和小浮点值如何用定点表示
【发布时间】:2020-06-30 15:58:23
【问题描述】:

我知道在没有Floating Point Units 的机器上,这些数字应该以定点表示,或者使用libc 模拟FPU。

在前一种情况下,非常大和非常小的 FPU 值如何在定点上表示? 我的理解是,定点的十进制分辨率数量有限,这里解释: Is fixed point math faster than floating point?

因此,如果我尝试在C 中编译一个非常小/大的 FP 值,对于没有 FPU 的机器,如何 那个数字在定点被压制?

【问题讨论】:

  • 浮点数在 C 中始终是浮点数。它不是定点数。
  • 如果机器没有FPU,浮点计算在软件中完成。
  • 如何选择以定点表示数字取决于程序员,并且因应用程序而异。例如,金钱通常表示为整数十分之一美分。天文数据库可能会使用整数 gigameters 或其他东西。这完全取决于应用程序。
  • 64 位定点数的十进制分辨率为 1/(2^32),浮点数的十进制分辨率最高为 1/(2^53) 那么如何表示固定品脱的 FP 值大到什么时候都看不出来?
  • 使用整数数组。这就是 bignum 库的工作方式。因此,如果您使用一个由八个 32 位整数组成的数组,您可以有一个 256 位的数字,并且可以将一个 64 位的变量用于部分乘积等。就像您可以在纸上写一个十进制数一样,如只要纸张大小允许,并对其进行“普通”算术运算。

标签: c floating-point fixed-point


【解决方案1】:

原则上,您是否具有通用浮点数(例如 IEEE-754 floatdouble)或定点数都没有关系。对于非常大(绝对)的值和非常小的值,两者都有其限制。

  • 一个非常小的数字(小于不等于零的最小定点值,或它的一半,取决于四舍五入)将表示为零。接近下限会增加不准确性,因为可用位数会变小。

  • 一个很大的数(超过最大不动点的绝对值,还有一点,取决于四舍五入)无法表示。

例如,为方便起见,以十进制为基数,数字通常以二进制为基数:

假设您有一个带符号的定点,定义为小数点左侧 3 位和右侧 2 位。

  • 一个值与另一个值之间的最小差异是 0.01。

  • 不等于0的最小值是-000.01和+000.01。

  • 最大值为 -999.99 和 +999.99。

  • 假定舍入。

像 PI 这样的值将表示为 3.14,误差约为 0.05%。

如果您尝试分配一个小于 000.005 的绝对值,它将被表示为 0。

如果您尝试分配像 0.12345 这样的小值,它将被表示为 0.12,误差仅为 3% 左右。

如果您尝试分配大于或等于 999.995 的值,则不能这样做。如果你的定义知道溢出的概念,这就是结果。

【讨论】:

  • 我明白了。假设我有一个32 bit int 和一个64 bit double fraction。我知道在具有 8 位寄存器的微控制器上,一个大的 int 被分成多个块。用定点表示的64 bit fraction 也会发生同样的情况吗?在没有 FPU 的芯片上?
  • @Dan 你为什么要使用double 作为分数,浪费它的指数位? -- 当然,在 8 位系统上,所有大于 8 位的对象都需要分成 8 位块。还是我没明白你的意思?
  • 那不是精度,那是精度损失,相反。此外,根据舍入策略,999.995 可能会被截断为 999.99。
  • @JohnMcFarlane 抱歉,英语不是我的母语。准确度和精确度都是我的意思的翻译:精确值与其表示之间的相对差异。
  • @thebusybee 我同意准确性和精确度在这里可以互换。但是你的数字描述的是不准确,而不是准确。他们没有描述精确度;他们描述了精度的损失。如果你的回答没有与它的意思相反,我可以同意你的回答。
【解决方案2】:

大和小浮点值如何用定点表示
这个数字怎么会在定点被压制?

定点表示法与浮点数不同,既不在 C 语言中定义,也不在标准 C 库中。

定点范围和精度细节取决于程序员,也可能由选定的辅助定点库决定。

如果实现具有浮点单元,对浮点编码和功能的影响很小甚至没有影响。当然性能会受到影响。

FPU 可能会也可能不会影响定点选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多