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.

[参考译文] BQ34110:TRM 5.11浮点转换的测试向量

Guru**** 2477255 points
Other Parts Discussed in Thread: BQ34Z100, BQ34110

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/689337/bq34110-test-vectors-for-trm-5-11-floating-point-conversion

器件型号:BQ34110
主题中讨论的其他器件:BQ34Z100

我们可能必须实施 TRM 5.11浮点转换(图5-3详细说明了如何将浮点 CC 增益和 CC Delta 值转换为监测计识别的格式。)

如果我们这么做、我们将需要一种方法来验证我们是否正确使用了算法。 我们是否可以使用任何值来测试算法、以便我们知道算法是否正确?

比如已知输入和预期输出?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将尝试找到一些已知的输入/输出对、但同时、这些帖子可能会有所帮助。

    e2e.ti.com/.../1546093
     
    e2e.ti.com/.../2024144

    请参阅以下内容的第12页: www.ti.com/.../slua640b.pdf

    有关我们的许多监测计(如 bq27xxx、bq34z100和 bq34110)的浮点格式的一般信息:
    双精度型不符合 IEEE 标准;它采用大端序、先是指数。  接下来的3个字节是尾数、其中隐含的第一位为1、因此会在数字的精度中挤压一个额外的位。  但是、请注意尾数第一个字节的 MSB 是符号位。
     
    以下是‘C’代码,用于获取4个字节,并在典型的基于英特尔的计算机(小端字节序)上将测量仪表的大端字节序转换为双字节序。
     
               uchar p[]={82、20、21、22};      //带有起始浮点的假设字节
    int s、e;
               双 x;
               union int_Byte{
                           UINT I;
                           UCHAR c[4];
               } d;
     
               e=*p++;                       //指数
               S=(*p)&0x80;                //编号符号
               D.c[3]=0;                      //因为尾数只有3个字节
               D.c[2]=(*p++)|0x80;       //翻转字节
               D.c[1]=(*p++);
               D.c[0]=(*p++);
     
               x=d.i * pow (2、e-128-24); // 128是指数的隐含符号、而24是尾数中隐含1作为高电平位
               如果
                           X=-x;               //将正确签名的值作为双精度型,采用 Intel (IEEE-)格式
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 David。 我只需要一个输入和一个输出。
    如果找不到、是否有人可以确认 TRM 流程图的确切实施:

    #include "math.h"
    空 calc (浮点 val)
      int exp = 0;
      float mod_val = val;
      如果(val < 0)
      {
        mod_val *=-1.0;
      }
      float tmpVal = mod_val;
      tmpVal *=(1.0 + pow (2.0、-25.0));
      IF (tmpVal < 0.5)
      {
        while (tmpVal < 0.5)
        {
          tmpVal *= 2;
          EXP--;
        }
      }
      其他
      {
        if (tmpVal >= 1.0)
        {
          while (tmpVal >= 1.0)
          {
            tmpVal /= 2.0;
            EXP++;
          }
        }
      }
      如果(exp > 127)
      {
        Exp = 127;
      }
      其他
      {
        如果(exp <-128)
        {
          EXP=-128;
        }
      }
      tmpVal = pow (2.0、8-exp)* mod_val - 128;
      int byte2 = tmpVal;
      tmpVal = 256 *(tmpVal - byte2);
      int byte1 = tmpVal;
      tmpVal = 256 *(tmpVal - byte1);
      int byte0 = tmpVal;
      如果(val < 0.0)
      {
        字节2 |= 0x80;
      }
      Int RawData[4];
      RawData[0]= exp + 128;
      RawData[1]=字节2;
      RawData[2]=字节1;
      RawData[3]=字节0;
      //printf ("rawdata=0x%02x%02x%02x%02x%02x\n"、
      //     RawData[0]、
      //     RawData[1]、
      //     RawData[2]、
      //     RawData[3]);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    示例输出:
    十六进制 float
    00000000 1.46936793853e-39
    81800000-1.0
    81000000 1.0
    8b1a522b 1234.56774902
    8e88f5ba -8765.43164062
    94452578 807511.5
    7f5e9624 0.434739232063
    977b2169 8229044.5
    7d063fa8 0.0655511021614
    9b2b2e2a 89747792.0
    7f3efd94 0.37302839756
    962f2f49 2870226.25
    9b2f7784 91995168.0
    906c32dc 60466.859375
    963b28db 3066422.75
    7e703f1e 0.234615772963
    873a005e 93.0007171631
    841683fb 9.40722179413
    8225884f 2.58644461632
    8b22d71e 1302.72241211
    93270dbd 342125.90625
    9c158969 156800656.0
    8847c72f 199.778060913.
    893d0bbf 378.091766357
    9c72e870 254707456.0
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 David。

    这些是来自您的算法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们的一位开发人员编写了 Python 脚本并生成了这些对。 它们是否与您的结果匹配?
    遗憾的是、在 TI 外部共享代码的过程并不容易、因此我无法向您发送他使用的 Python。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的! 这些输入通过上面的代码运行会产生完全相同的输出。 太棒了! 谢谢 David。