Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在elf gcc中,exp()仅在第一次调用时正确工作,而不是在之后_C_Gcc_Linker_Floating Point_Sparc - Fatal编程技术网

在elf gcc中,exp()仅在第一次调用时正确工作,而不是在之后

在elf gcc中,exp()仅在第一次调用时正确工作,而不是在之后,c,gcc,linker,floating-point,sparc,C,Gcc,Linker,Floating Point,Sparc,我正在使用我们团队开发的处理器(sparc体系结构)和gcc elf工具链,在我们的主板上使用裸机程序(无操作系统)运行耗时的算法。使用soft float,它工作得很好,我在一个多小时后就得到了想要的结果(这纯粹是软件运行,用后来的特殊硬件会大大缩短)。但使用硬浮动,我可以在15分钟内完成,效果很好。好的,但是在硬浮点的某些配置中,我发现exp()函数工作不正常。在这种情况下,我希望正确打印float 我编写了一个测试exp()函数的测试代码 ab_printf("------- exp te

我正在使用我们团队开发的处理器(sparc体系结构)和gcc elf工具链,在我们的主板上使用裸机程序(无操作系统)运行耗时的算法。使用soft float,它工作得很好,我在一个多小时后就得到了想要的结果(这纯粹是软件运行,用后来的特殊硬件会大大缩短)。但使用硬浮动,我可以在15分钟内完成,效果很好。好的,但是在硬浮点的某些配置中,我发现exp()函数工作不正常。在这种情况下,我希望正确打印float

我编写了一个测试exp()函数的测试代码

ab_printf("------- exp test--------\n");
float a[5] = {-0.438984, -0.357934, 0.174203, 0.280720, 0.372380};
for(i=0;i<5;i++){
ab_printf("x = %f, y = %f\n", a[i], 1./(1.+exp(-1.*a[i])));
}
ab_printf("------- end of exp test--------\n");
然后,我切换到硬浮点(使用硬件FPU,=remove-msoft float生成硬件浮点指令),但我知道exp()函数是由工具集使用软件实现的。(CPU中没有exp指令。因此工具链库将使用泰勒展开或其他方法…)。当使用硬浮点时,我使用两个库作为链接器,如下所示

LIBS        +=  -L/opt/abde/lib/gcc/sparc-ab-elf/4.6.2/soft/v8   # line 1
LIBS        +=  -L/opt/abde/sparc-ab-elf/lib/soft/v8    # line 2
如果我在第1行中使用v8而不是soft/v8,程序在打印浮点数时停止,所以这不是一个选项。我怀疑我的工具集没有正确构建,但我现在无法在系统中构建它

如果我在第2行中使用v8而不是soft/v8,我会看到浮点数的数据有误。但是我知道我可以在这个设置中得到很好的检测结果,尽管我看到一些小的浮点错误随着处理的进行而累积,而且我知道在这个设置中exp()函数也可以工作(因此15分钟后最终的正确结果)

在硬浮点模式下,当我从I=0开始运行时,它会给出以下结果(只有第一个正确工作):

当我从I=1运行它时,它会给我(同样,只有第一个正确)


这是什么情况?问题是我现在无法在我的系统上构建工具链。

使程序使用浮动而不是双值。如果您使用像1.0这样的文字,它是双精度的。改用1.0f。exp接受double参数并返回double

1.+exp(-1.*a[i])将a[i]转换为double,然后执行double操作,然后再次转换为单浮点。它对精度有相当重要的影响。我不知道您的FPU使用什么数字(32位或64位)。让它们都和FPU一样


请注意,根据浮点类型(expf、exp、expl),您有不同的exp函数。

使程序使用浮点而不是双精度值。如果您使用像1.0这样的文字,它是双精度的。改用1.0f。exp接受double参数并返回double

1.+exp(-1.*a[i])将a[i]转换为double,然后执行double操作,然后再次转换为单浮点。它对精度有相当重要的影响。我不知道您的FPU使用什么数字(32位或64位)。让它们都和FPU一样


请注意,根据浮点类型(expf、exp、expl),您有不同的exp函数。

看起来它与浮点打印usinb ab_printf有问题。我发现其他平台在打印浮动时有另一个问题。(). 因此,我选择使用此设置:

LIBS        +=  -L/opt/abde/lib/gcc/sparc-ab-elf/4.6.2/soft/v8   # line 1
LIBS        +=  -L/opt/abde/sparc-ab-elf/lib/v8    # line 2

此设置允许我使用硬浮点,除了float printf之外没有其他问题。所以为了打印浮点值,我决定放弃像(int)(1./(1.+exp(-1.*a[I])*10000.)这样的操作,并使用十进制整数打印。希望有人能提供另一个好的解决方案。

看起来它在浮动打印方面有问题。我发现其他平台在打印浮动时有另一个问题。(). 因此,我选择使用此设置:

LIBS        +=  -L/opt/abde/lib/gcc/sparc-ab-elf/4.6.2/soft/v8   # line 1
LIBS        +=  -L/opt/abde/sparc-ab-elf/lib/v8    # line 2

此设置允许我使用硬浮点,除了float printf之外没有其他问题。所以为了打印浮点值,我决定放弃像(int)(1./(1.+exp(-1.*a[I])*10000.)这样的操作,并使用十进制整数打印。希望有人能提供另一个好的解决方案。

一种可能是ab_printf处理中的某些东西正在弄乱硬件浮点。为了验证这个理论,你可以将结果存储在循环中的一个数组中,然后只从后面的循环中输出。这是一个很好的猜测,我尝试过,但事实并非如此。谢谢对于其他
math.h
函数,如
sin
atan
等,您是否会得到混乱的结果,或者该问题特定于
exp
?最好也不要考虑
printf
问题,因为将浮点值转换为十进制输出的代码可能比执行
exp
@MarkDickinson sin()的代码复杂得多。我发现如果我使用
I
循环打印,它打印的是ok(我的意思是显式索引为0,1,2,3,…它打印的是ok)。当我用循环打印时,它就乱七八糟了。当使用循环打印浮点时,ab_printf似乎有一个bug。您是否启用了优化?如果是这样的话,在关闭它们的情况下进行测试是值得的。一种可能是ab_printf处理中的某些东西弄乱了硬件浮点。为了验证这个理论,你可以将结果存储在循环中的一个数组中,然后只从后面的循环中输出。这是一个很好的猜测,我尝试过,但事实并非如此。谢谢对于其他
math.h
函数,如
sin
atan
等,您是否会得到混乱的结果,或者该问题特定于
exp
?最好也不要考虑
printf
问题,因为将浮点值转换为十进制输出的代码可能比执行
exp
@MarkDickinson sin()的代码复杂得多。我发现如果我使用
I
循环打印,它打印的是ok(我的意思是显式索引为0,1,2,3,…它打印的是ok)。当我用循环打印时,它就乱七八糟了。当使用循环打印浮点时,ab_printf似乎有一个bug。您是否启用了优化?如果是这样的话,关闭它们可能值得测试。我检查过它与float,double无关。如果我打印时没有循环,
------- exp test--------
x = -0.357934, y = 0.411460
x = 0.174203, y = 1.000000
x = 0.280720, y = 1.000000
x = 0.372380, y = 1.000000
------- end of exp test--------
LIBS        +=  -L/opt/abde/lib/gcc/sparc-ab-elf/4.6.2/soft/v8   # line 1
LIBS        +=  -L/opt/abde/sparc-ab-elf/lib/v8    # line 2