gpt4 book ai didi

c - 理解定点运算

转载 作者:太空狗 更新时间:2023-10-29 17:25:58 24 4
gpt4 key购买 nike

我正在努力解决如何对不同精度的定点数执行算术运算。我读过the paper by R. Yates ,但我还是迷路了。在下文中,我使用 Yates 的表示法,其中 A(n,m) 指定具有 n 整数位的带符号定点格式,m 小数位,n + m + 1 位。

小问题:A(a,b)*A(c,d)A( a,b)+A(c,d) 执行时 a != cb != d?

长问题:在我的 FFT 算法中,我生成了一个随机信号,其值介于 -10V 和 10V 之间,有符号输入(输入)被缩放到 A(15,16),旋转因子 (tw) 缩放为 A(2,29)。两者都存储为 int。像这样:

float temp = (((float)rand() / (float)(RAND_MAX)) * (MAX_SIG - MIN_SIG)) + MIN_SIG;
int in_seq[i][j] = (int)(roundf(temp *(1 << numFracBits)));

旋转因子也是如此。

现在我需要执行

  1. res = a*tw
    问题:
    a)我该如何实现?
    b) res 的大小应该是 64 位吗?
    c) 因为我知道 atw 的范围,所以我可以将“res”设为 A(17,14) 吗?如果是,我是否应该将 a*tw 缩放 2^14 以在 res 中存储正确的值?

  2. a + res
    问题:
    a)这两个不同Q格式的数字如何相加?
    b)如果没有,我该如何操作?

最佳答案

也许举个例子最简单。

假设您要添加两个数字,一个格式为 A(3, 5) , 另一个格式为 A(2, 10) .

您可以通过将两个数字转换为“通用”格式来实现 - 也就是说,它们的小数部分应该具有相同的位数。

保守的做法是选择更多的位数。即,将第一个数字转换为A(3, 10)将它左移 5 位。然后,添加第二个数字。

加法的结果具有较大格式的范围,加上 1 位。在我的示例中,如果您添加 A(3, 10)A(2, 10) , 结果的格式为 A(4, 10) .

我称此为“保守”方式,因为您不会丢失信息 - 它保证结果可以定点格式表示,而不会丢失精度。但是,在实践中,您会希望对计算结果使用较小的格式。为此,请考虑以下想法:

  1. 您可以使用不太准确的格式作为您的常用表示形式。在我的示例中,您可以将 second 数字转换为 A(2, 5)通过将整数 移动 5 位。这会损失精度,通常这种精度损失不会有问题,因为无论如何您都会向它添加一个不太精确的数字。
  2. 结果的整数 部分可以少使用 1 位。在应用中,经常会出现结果不能太大的情况。在这种情况下,您可以少分配 1 位来表示它。您可能想检查结果是否太大,并且 clamp它达到所需的范围。

现在,关于乘法。

可以将两个定点数直接相乘 - 它们可以是任何格式。结果的格式是“输入格式的总和”——所有部分相加——整数部分加 1。在我的示例中,乘以 A(3, 5)A(2, 10)给出格式为 A(6, 15) 的数字.这是一个保守的规则 - 输出格式能够在不损失精度的情况下存储结果,但是在应用程序中,几乎总是您想要降低输出的精度,因为它的位数太多了。


在您的情况下,所有数字的位数都是 32,您可能希望以所有中间结果都具有 32 位的方式失去精度。

例如,乘以A(17, 14)A(2, 29)给出 A(20, 43) - 需要 64 位。您可能应该从中删除 32 位,然后丢弃其余部分。结果的范围是多少?如果你的旋转因子是一个最大为 4 的数字,则结果可能受 2^19 的限制(需要上面的保守数字 20 来适应将 -1 << 31 乘以 -1 << 31 的边缘情况 - 几乎总是值得拒绝这个边缘-案例)。

所以使用A(19, 12)对于您的输出格式,即从输出的小数部分中删除 31 位。

所以,而不是

res = a*tw;

你可能想要

int64_t res_tmp = (int64_t)a * tw;      // A(20, 43)
if (res_tmp == ((int64_t)1 << 62)) // you might want to neglect this edge case
--res_tmp; // A(19, 43)
int32_t res = (int32_t)(res_tmp >> 31); // A(19, 12)

关于c - 理解定点运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38055861/

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