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.

[参考译文] TMS570LC4357:浮点值问题

Guru**** 2468460 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1058920/tms570lc4357-issue-on-floating-point-values

器件型号:TMS570LC4357

尊敬的 TI:

在传递函数参数中的 Float32值时、参数中的 Float32变量不会获取与用户传递的值完全相同的值。 该问题仅针对中间值观察到。

例如:如果我在参数中传递了"1.2"、则它采用"1.20000005"、并且这种行为也不一致。 请查看以下一组值:

1.1 => 1.10000002
1.2 => 1.20000005
1.3 => 1.29999995
1.4 => 1.39999998
1.5 => 1.5
1.6 => 1.60000002
1.7 => 1.70000005
1.8 => 1.79999995
1.9 => 1.899998

请尽快提供您对上述问题的意见。

此致、
Parth

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

    浮点指南 是否有帮助?

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

    切斯特、您好!

    感谢您的回复。

    不、对于我提出的问题、从浮点指南中没有得到准确的解决方案、因为我在计算过程中没有遇到这个问题、而是在将值传递到函数参数中的变量时看到这个行为。

    其次、根据指南、我们提到为了解决这个问题、我们可以将该值舍入到更少的十进制值(从8个小数点到6或5)、但这对于我获得较小十进制值的人不起作用。 例如 、1.4 => 1.39999998、 1.8 => 1.799995等

    请提供您对上述解决方案的意见。

    此致、

    Parth

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

    您好 Parth、

    IEEE 754浮点标准要求数字以二进制格式存储。 浮点十进制值1.2的浮点二进制数为:

    1.0011_0011_0011_0011_0011_0011_010

    Value=1.2、要将小数部分(0.2)转换为二进制、请将小数部分乘以 2 、并获取出现在小数点之前的一位。

    在小数点之后执行相同的步骤(.) 直到它变为1.0。

    0.2 * 2 =  0.4 //取0并将0.4移动到下一步

    0.4 * 2 =0.8  //取0并将0.8移动到下一步

    0.8 * 2 =1.6 //执行1并将0.6移动到下一步

    0.6 * 2 =1.2 //执行1并将0.2移动到下一步

    0.2 * 2 =0.4 //取0并将0.4移动到下一步

    0.4 * 2 =0.8 //取0并将0.8移动到下一步

    (笑声) (笑声) 重复到23位 (对于32位浮点、1个符号位、8个指数位和23位小数)

    分数0.2的浮点二进制数为:0011-0011-0011-0011-0011-0011-0011-0011-001 (1)、第24位被四舍五入->0011-0011-0011-0011-0011-0011-0011-0011-0011-0011-010

    符号位(1位):B0 (正)

    指数位(8位):b01111111  

    小数位(23位):0011-0011-0011-0011-0011-0011-0011-0011-010

    SO 1.2 -> b0-011111-0011001100110011010  

    十六进制格式:0x3F99999A  

    当代码读回该数字时、它会将浮点二进制数转换为浮点十进制格式:

    比例数转换为:1*1/2^3+1*1/2^4+1*1/2^7+1*1/2^8+1*1/2^11+1*1/2^12+1*1/2^15+1*1/2^16+1*1/2^19+1*1/2=1/2*1.00002*1/2=1.22^^20048

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

    我发现这款有用的工具可以将 所有 现代 CPU (IEEE 754浮点)使用的浮点十进制数转换为浮点二进制数。

    https://www.h-schmidt.net/FloatConverter/IEEE754.html