This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28335:转换值不准确

Guru**** 2606725 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/683435/tms320f28335-inaccurate-conversion-value

器件型号:TMS320F28335

尊敬的所有:

是否有人使用 IQ 格式的定点算术? 我转换的值为何不准确?

例如_IQ30 (-1.9031620687379)、结果为- 1.903162122;

根据官方文件,应该有10个有效的数字, 我只有7个。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您是否尝试使用_IQ30 (-1.903162068)代替上述较大数据。 该文档提到十进制后的9位数字。 它似乎是以某种方式近似计算较大的数据值。

    此致、
    Gautam
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的七位、

    IQ30类型转换是 IQmathLib.h 中的一个宏、可将变量乘以2^30。  您需要在数据中附加'L'、以便预处理器知道使用64位中间数据类型。  否则、您将失去精度。  尝试:

    _IQ30 (-1.9031620687379L)

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Han Seven、

    您应该指定转换的内容和方式。 要悬空的_IQ30? 然后、您应该下次回答。

    将_IQ30转换为浮点的结果是正确的。 _IQ30是32位数、浮点尾数仅为24位宽! 让我们计算:

    _IQ30 (-1.9031620687379)=整数(-1.9031620687379 * 2^30)=-0x79CD6846。
    将这些位转换为浮点值首先归一化,-0x79CD6846 <<1 =-0xF39AD08C。 然后丢失8个最低有效位、更高阶的24位数将四舍五入为最接近的数字。 -0xF39AD08C ->-0xF39AD100。 现在、要计算转换 IQ30 -> float、我们需要将其除以2^(30+1)、其中+1来自标准化步骤(<< 1)。 我得到-1.90316212177276611328125。 非常接近您看到的内容。

    IQ30裂变、当接近最大值(+-2.0)时、比浮点好得多。 高达 Iq ()= 2^24 / 2^30 =+-0.015625您不会丢失任何转换为浮点的位。 从2^24 / 2^30浮点精度下降将远远好于 IQ30精度。


    此致
    Edward