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.
工具/软件:Code Composer Studio
我们在使用 CCS 的项目和软件开发中使用 TMS570LS3137 (版本:6.0.1.00040)。 我们正在分析属于它的所有错误。 我们碰巧看到 TI 编译器勘误表"ARM 浮点转换例程不支持 NaN"。
我们不确定此勘误表的影响、我们很想知道它。 当我们尝试通过以下代码模拟 NaN 条件并且 x 已被分配 NaN 时。 这与编译器勘误表有关吗?
伪代码:
浮点 x;
x = 0.0f/0.0f;
[引用 user="Subash Sundaresan"]此操作是否与编译器勘误表相关?
否
当值从类型 float 转换为类型 double 时、会调用 RTS 库中的函数来执行该任务。 问题是这些函数会错误地将 NaN 更改为无穷大。 在您的伪代码中、不需要转换、因此不会出现问题。 自编译器版本5.2.6 (于2015年10月发布)以来、此问题已得到解决。
谢谢、此致、
乔治
尊敬的乔治:
非常感谢您的回答。
我们尝试根据您的输入(通过浮点至双精度转换)重现此问题、但我们未能这样做。 请告诉我们如何模拟问题(提供一些代码片段)。
伪代码1:
双 y;
y = 0.0f / 0.0
在调试窗口中:
Y = NaN
内存浏览器:
0x08001330 7FF80000
伪代码2:
浮点 x;
双 y;
x = 0.0f/0.0f
y =(双精度) x;
在调试窗口中:
X = NaN
Y = NaN
内存浏览器:
(x) 0x08001328 7FC00000
(Y) 0x08001330 7FF80000
注:请注意 x 和 y 的 NaN 的不同数字存储器表示;
我们在项目计划中选择了编译器版本5.1.6,因此无法中间更改编译器版本。 根据您的输入、此问题适用于此编译器版本(5.1.6)、 我们只想包含更新的 CRTL 库函数、而不是修改不同的编译器版本。 请告诉我们在哪里可以获得更新的 CRTL 库函数。
谢谢、
Subash
0/0未定义、编译器可以返回所需的任何值、NaN 或无穷大。 您可以自由地检查0/0并提供您认为合适的任何答案。
您正在描述 CodeGen-831、也称为 SDSCM00049912。 以下是一个测试案例、展示了错误的行为:
/* armcl --abi=eabi CQ49912.c -z -llnk.cmd */
#include
#include
#include
int main()
{
易失性浮点 y = NaN;
断言(isnan ((double) y));
}
我仍然无法重现问题、
我已经测试了以下情况、但两者都产生相同的结果、换句话说、在这两种情况下、程序控制跳转到下一条指令 、即 x = x + 1;
/*场景-1 */
/* armcl --abi=eabi CQ49912.c -z -llnk.cmd */
#include
#include
#include
int main()
{
易失性浮点 y = NaN;
int x;
断言(isnan ((double) y));
x = x + 1;
}
/*场景-2 */
/* armcl --abi=eabi CQ49912.c -z -llnk.cmd */
#include
#include
#include
int main()
{
volatile double y = NaN;
int x;
断言(isnan(y);
x = x + 1;
}
PS:我们希望在 旧的编译器版本5.1.6中包含更新的编译器 CRTL 函数。 请向我们提供最新的编译器 CRTL 库。
TI ARM 编译器版本5.2.0至5.2.5中存在此错误。 您使用的版本5.1.6没有此错误。 很抱歉、我之前没有注意到这个细节。
谢谢、此致、
乔治