首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数学霓虹库中的函数cosf_neon和sinf_neon会返回相同的值吗?

数学霓虹库中的函数cosf_neon和sinf_neon会返回相同的值吗?
EN

Stack Overflow用户
提问于 2018-03-20 19:03:12
回答 1查看 263关注 0票数 0

我已经将数学霓虹库移植到了我的平台上。但在运行测试代码math_debug时,我和我在此示例中添加了cosf_neon和sinf_neon,它们将返回相同的值。就像这样(这些代码被添加到数学霓虹库的测试代码中):

代码语言:javascript
复制
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函数是:

代码语言:javascript
复制
#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是这样的:

代码语言:javascript
复制
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]网站下载

期待得到一些建议。

EN

回答 1

Stack Overflow用户

发布于 2019-05-23 20:58:44

请在下面使用:

代码语言:javascript
复制
float cosf_neon_sfp(float x)
{
    return sinf_neon_sfp(x + M_PI_2);
}

不应该在cosf_neon_hfp中使用'float xx =x+ M_PI_2‘,也许应该使用assemble

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49382527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档