gpt4 book ai didi

在 C 中实现 round() 的简洁方法?

转载 作者:太空狗 更新时间:2023-10-29 16:34:35 26 4
gpt4 key购买 nike

我正在使用的嵌入式 C 没有 round() 函数它是数学库,在 C 中实现它的简洁方法是什么?我正在考虑将它打印成一个字符串,寻找小数位,然后找到句点后的第一个字符,如果 >= 5 则向上舍入,否则向下舍入。等。想知道是否有更聪明的东西。

谢谢,弗雷德

最佳答案

正如许多其他答案所暗示的那样,您可以重新发明轮子。或者,您可以使用其他人的轮子——我建议使用 Newlib 的,它是 BSD 许可的,旨在用于嵌入式系统。它可以正确处理负数、NaN、无穷大和不能表示为整数的情况(由于太大),并以一种使用指数和掩码而不是通常成本更高的浮点运算的有效方式来处理。此外,它会定期进行测试,因此您知道它没有明显的极端情况错误。

Newlib 源代码导航起来可能有点笨拙,所以这里是您想要的部分:

float 版本: https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=newlib/libm/common/sf_round.c;hb=master

双重版本: https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=newlib/libm/common/s_round.c;hb=master

此处定义的词提取宏: https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=newlib/libm/common/fdlibm.h;hb=master

如果你需要那里的其他文件,父目录是这个: https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=tree;f=newlib/libm/common;hb=master

作为记录,这里是 float 版本的代码。如您所见,正确处理所有可能的情况需要一些复杂性。

float roundf(x)
{
int signbit;
__uint32_t w;
/* Most significant word, least significant word. */
int exponent_less_127;

GET_FLOAT_WORD(w, x);

/* Extract sign bit. */
signbit = w & 0x80000000;

/* Extract exponent field. */
exponent_less_127 = (int)((w & 0x7f800000) >> 23) - 127;

if (exponent_less_127 < 23)
{
if (exponent_less_127 < 0)
{
w &= 0x80000000;
if (exponent_less_127 == -1)
/* Result is +1.0 or -1.0. */
w |= ((__uint32_t)127 << 23);
}
else
{
unsigned int exponent_mask = 0x007fffff >> exponent_less_127;
if ((w & exponent_mask) == 0)
/* x has an integral value. */
return x;

w += 0x00400000 >> exponent_less_127;
w &= ~exponent_mask;
}
}
else
{
if (exponent_less_127 == 128)
/* x is NaN or infinite. */
return x + x;
else
return x;
}
SET_FLOAT_WORD(x, w);
return x;
}

关于在 C 中实现 round() 的简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com