/*
* log-test.xc
*
* Created on: 02.03.2014
* Author: bernhard
*/
#include <stdio.h>
#include <math.h>
int main(void) {
timer t;
int starttime;
int stoptime;
float ln = exp( 1);
float f1 = 1.2345;
float f2 = 6.789;
printf( "Hello XMOS!\n");
t :> starttime;
ln = log( ln);
t :> stoptime;
printf( "ln( e)=%f duration=%dns\n", ln, ( stoptime - starttime) * 10);
t :> starttime;
f2 = f1 * f2;
t :> stoptime;
printf( "float1 * float2 =%f duration=%dns\n", f2, ( stoptime - starttime) * 10);
return 0;
}
测试程序的控制台输出:
Hello XMOS!
ln( e)=1.000000 duration=80750ns
float1 * float2 =8.381021 duration=1550ns
提前感谢您的帮助。
附件:log-test.xc
回答1:
你可以尝试改变的优化级别的O2或O3。您可以通过更改下面的应用程序的Makefile做到这一点:
XCC_FLAGS_Debug = -O3 -g
回复:
是的,我做了测试与-O3 -g具有相同的结果!
Hello XMOS!
ln( e)=1.000000 duration=80740ns
float1 * float2 =8.381021 duration=1550ns
回答2:
由于xCORE不具备浮点它必须用软件模拟硬件支持,这会减慢速度。也许你可以用固定点呢?有日志在以下的档案库“8.24”定点格式的实现:
https://github.com/xcore/sc_lib_fixed_point
回答3:
log(a*10^b) = log10(a*10^b) / log10(e) = (b + log10(a) ) / log10(e)
这意味着,如果你有一个数字底数10,和你有一个查表插值log10(a)所示,在区间| 110 |,你可以计算出的自然对数与
const double c = 1/log10(e) =>
ans = (b+table_lookup(a))*c
OTP存储器,可考虑该表。
或者如果浮子被存储在底数2
log(a*2^b) = (b + log2(a)) / log2(e) ... you need a table-lookup for the interval |1 2|
回复:
非常感谢你们的建议。我将测试它和上传它的结果。