我已经将数学霓虹库移植到了我的平台上。但在运行测试代码math_debug时,我和我在此示例中添加了cosf_neon和sinf_neon,它们将返回相同的值。就像这样(这些代码被添加到数学霓虹库的测试代码中):
printf("cosf neon result is %f\n", cosf_neon(0.366519));
printf("sinf neon result is %f\n", sinf_neon(0.366519));这两个函数的结果都是0.358367。但是C库中的cos和sin会返回不同的值。cosf_neon的正确值为0.933580,sinf_neon的正确值为0.358368。
cosf_neon函数是:
#define sinf_neon sinf_neon_sfp
#define cosf_neon cosf_neon_sfp
float cosf_neon_hfp(float x)
{
#ifdef __MATH_NEON
float xx = x + M_PI_2;
return sinf_neon_hfp(xx);
#endif
}
float cosf_neon_sfp(float x)
{
#ifdef __MATH_NEON
asm volatile ("vdup.f32 d0, r0 \n\t");
cosf_neon_hfp(x);
asm volatile ("vmov.f32 r0, s0 \n\t");
#else
return cosf_c(x);
#endif
}makefile是这样的:
CC=arm-linux-androideabi-gcc
AR=arm-linux-androideabi-ar
LD=arm-linux-androideabi-ld
CFLAGS := -O2 -ggdb -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon -ansi -std=gnu99 -pedantic
WARNINGS := -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes
ASSEMBLER := -Wa,-mimplicit-it=thumb
override CFLAGS += $(WARNINGS) $(ASSEMBLER)
LIBS := -lm
all: math_debug
libmathneon.a: math_acosf.o math_ldexpf.o math_powf.o math_sqrtfv.o \
math_asinf.o math_expf.o math_log10f.o math_runfast.o math_tanf.o \
math_atan2f.o math_fabsf.o math_logf.o math_sincosf.o math_tanhf.o \
math_atanf.o math_floorf.o math_mat2.o math_sinf.o math_vec2.o \
math_ceilf.o math_fmodf.o math_mat3.o math_sinfv.o math_vec3.o \
math_cosf.o math_frexpf.o math_mat4.o math_sinhf.o math_vec4.o \
math_coshf.o math_invsqrtf.o math_modf.o math_sqrtf.o
math_debug: math_debug.o libmathneon.a
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
%.o:: %.c
$(CC) $(CFLAGS) -o $@ -c $<
%.a::
$(AR) rcs $@ $^
clean:
$(RM) -v math_debug *.o *.a数学霓虹库可从 [https://code.google.com/archive/p/math-neon/source/default/source][1]网站下载
期待得到一些建议。
发布于 2019-05-23 20:58:44
请在下面使用:
float cosf_neon_sfp(float x)
{
return sinf_neon_sfp(x + M_PI_2);
}不应该在cosf_neon_hfp中使用'float xx =x+ M_PI_2‘,也许应该使用assemble
https://stackoverflow.com/questions/49382527
复制相似问题