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.

[参考译文] CCS/TMS320VC5502:较新的编译器以不同的方式处理浮点至整数转换

Guru**** 1490575 points
Other Parts Discussed in Thread: TMS320VC5502, TMS320VC5402
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/680249/ccs-tms320vc5502-newer-compiler-handles-floating-point-to-integer-conversion-differently

器件型号:TMS320VC5502 (不是 TMS320VC5402、抱歉、拼写错误!)

工具/软件:Code Composer Studio

我将 CCS 3.2项目转换为 CCS 8.0。 转换后的工程抛出以下错误:

错误#175:浮点值不适合所需的积分类型

当对"接近" 32位有符号整数(long)的上限范围的浮点常量执行类型转换时、会发生错误。 当浮点值介于(long_MAX - 64) 和 long_MAX 之间时、编译器会发出提示。 编译器对该范围内的整数常量感到满意。 以下是一些示例:

long test1 =(long) 2147483583;//确定

long test2 =(long) 2147483583.0;//确定

long test3 =(long) 2147483583.9;//确定

long test4 =(long) 2147483584.0;//错误#175

long test5 =(long) 2147483584;//确定

long test6 =(long) 2147483646;//确定

long test7 =(long) 2147483646.0;//错误#175

long test8 =(long) 2147483646.9;//错误#175

long test9 =(long) 2147483647.0;//错误#175

long test10 =(long) 2147483647;//确定

这些结果是使用 cl55.exe 的 v4.4.1生成的。

这是编译器错误还是对某些隐式转换规则的新的、更严格的解释?

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

    您是否正在使用 VC5402器件? 我提出的原因是、文章中引用的编译器(cl55.exe)适用于 C55x 器件与 C54x 器件。 支持 C54x 开发的最后一个 CCS 版本是 CCSv5.5。

    此致、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我指的是 TMS320VC5502。 我更正了我的帖子(E2E 提交的帖子除外)、对这种混淆表示歉意。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没问题。 我只是想在循环使用编译器专家之前检查一下这个问题。 我现在要这么做。

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

    感谢您将此问题告知我们。  我可以重现相同的行为。  C5500编译器处于非活动状态。  错误不再修复。  但是、受支持的 C2000编译器也存在相同的问题。  因此、我针对 这两种编译器在 SDOWP 系统中提交了 CodeGen-4690。  这一问题的原因在两个编译器中几乎都是相同的。  在 C2000编译器中修复它可能(不保证!) 揭示 C5500编译器的权变措施。  欢迎您在我的签名中使用下面的 SDOWP 链接跟踪问题。

    谢谢、此致、

    乔治

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

    这里的问题是 C5500代表32位 IEEE 格式的所有三种浮点类型(浮点型、双精度型和长双精度型)。  这无法提供足够的精度来准确表示2147483583.0等  当从文本转换为32位 IEEE、然后转换为整数时、2147483583.0的结束值小于 long_MAX、但2147483584.0的结束值大于 long_MAX。  (具体而言、是2147483520和2147483648。  请注意、2147483520为24个1位、32位 IEEE 为24位尾数。)

    我无法回答为什么您对 CCS 3.2没有相同的问题。  可能在转换过程中发生了一些变化、可能早期编译器忽略了该问题、可能其他问题也不同。

    C2000还使用32位 IEEE 进行浮点和双精度运算、但使用64位 IEEE 进行长双精度运算。  对于该平台、2147483583.0L 是指定将常数干净转换为长整型的方法。  遗憾的是、C5500没有64位浮点类型、无法使用该技术。

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

    可能要做的是将 long_MAX 转换为浮点值、将其存储在某个位置、然后在转换中通过键入来首先根据该浮点值进行测试。 正数如下所示:

    const float longMaxAsFloat =(float) long_MAX;
    
    long ConvertFloatToLong (float Float)
    {
    if (Float >= LongMaxAsFloat)
    return long_MAX;
    
    /*可能也需要对负数进行一些处理*/

    返回(长)浮动; }

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

    尊敬的 pf:

    感谢您的跟进。 此问题出现在#define 宏中,该宏将浮点常量转换为定点整数表示(例如:#define  Q30(x)...)。 旧编译器可以毫无怨言地将尾数截断为24位、而新编译器会将其视为错误。 我将尝试向宏添加一些位掩码和位移、使其与新编译器配合使用。

    Joe

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

    感谢您的回答。 我的 float <-->整数转换在编译时而不是在运行时在#define 宏中进行。 我将看到一个更详尽的宏是否能够解决这个问题。