gpt4 book ai didi

c - 定点缩放和乘法精度

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:24 25 4
gpt4 key购买 nike

我需要对定点变量x(二进制小数点为6 [BP6]的无符号16位整数[U16]类型)执行乘法运算,系数A,我知道它总是介于 0 和 1 之间。代码是用 C 语言为 32 位嵌入式平台编写的。

我知道,如果我也将这个系数设为 U16 BP6,那么我最终会通过乘法得到 U32 BP12。我想将这个结果重新缩放回 U16 BP6,所以我只去掉前 10 位和最后 6 位。

但是,由于系数的精度受到小数位数的限制,而且我不一定需要完整的 10 位整数,所以我想我可以将系数变量设为 A U16 BP15 以产生更精确的结果。

我已经完成了以下示例(请耐心等待):

假设 x = 172.0(十进制),我想使用系数 A = 0.82(十进制)。理想的小数结果为 172.0 * 0.82 = 141.04。

在二进制中,x = 0010101100.000000

如果我对 A 使用 BP6,二进制表示将是

    A_1 = 0000000000.110100 = 0.8125 or
A_2 = 0000000000.110101 = 0.828125

(取决于值是基于下限还是上限)。

在 x 和 A 的任一值之间执行二进制乘法得到(不包括前导零):

    A_1 * x = 10001011.110000000000 = 139.75 
A_2 * x = 10001110.011100000000 = 142.4375

在这两种情况下,减少最后 6 位都不会影响结果。

现在,如果我将 A 扩展为具有 BP15,则

    A_3 = 0.110100011110110 = 0.82000732421875

以及由此产生的乘积

    A_3 * x = 10001101.000010101001000000000 = 141.041259765625

修剪多余的15位小数位时,结果为

    A_3 * x = 10001101.000010 = 141.03125

所以这里很清楚,通过扩展系数以具有更多的小数位会产生更精确的结果(至少在我的示例中是这样)。这是普遍适用的东西吗?这在实践中使用好/坏吗?我是否遗漏或误解了什么?

编辑:我应该在这里用“准确度”代替“精确度”。我正在寻找更接近我的预期值的结果,而不是包含更多小数位的结果。

最佳答案

在完成类似的代码后,我会说您所做的通常适用于以下问题。

  1. 围绕二进制小数点移动时很容易出现意外溢出。建议进行严格的测试/分析和/或代码检测。 Notable failure: Ariane_5

  2. 你想要精确,因此我不同意“放弃......最后 6”。相反,我建议在处理时间允许的情况下四舍五入您的结果。使用要截断的 MSBit 可能会调整结果。

关于c - 定点缩放和乘法精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19056657/

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