c - 使用 AVR-C 迭代 float 中的数字

标签 c avr

我目前使用它来迭代整数的数字 效果很好,除了单个 0 输入,这是可以预料的。

void hc595_number(unsigned int number) {    
    while(number) {
        hc595_digit(number % 10);
        number /= 10;
    }
}

但是我现在没有做的(因为 % 不接受 float 和整数)是迭代的​​,与 float 的数字相同。我还需要检测 float 并为下一个数字做一些不同的事情,而不是 hc595_digit,就像我可以为普通数字做的那样。

所以,基本上对于 12.4,我需要在 4 上调用 hc595_digit,然后记录下一件事,然后对于 2,调用不同的函数。

在 AVR-C 中实现它的最简单方法是什么

最佳答案

基于二进制的 float 并不像您想象的那样有十进制数字。

即使是整数也不会存储为十进制数字。它们用二进制表示。当您使用 % 10/10 时,您正在计算它们的十进制表示形式。 (如果它们以十进制表示形式存储,C 可能会有一些运算符来访问 数字,一种下标运算符,如 x[3] 来获取 x 的第三个数字。相反,您正在使用计算,例如 % 10,来计算数字。)

许多 C 实现对 double 使用 IEEE-754 基本 64 位二进制格式。假设您的 C 实现执行了,并且您执行了 x = 12.6;。那么x的值就不是12.6,因为12.6不能用这种格式表示。相反,12.6 被四舍五入为一个可表示的值。如果正确四舍五入到最接近的可表示值,则结果为 12.5999999999999996447286321199499070644378662109375。当您正确计算小数点后的第一位数字时,您将得到 5,而不是 6。

可以编写代码来获取这些数字。在良好的 C 实现中,最简单的方法是使用 snprintf 来格式化数字。也可以写计算来计算这些数字,C有fmodremainderremquomodf函数其作用类似于整数的 % 运算符。但是,在基于二进制的浮点格式中乘以 10 是有问题的,因为与大多数浮点运算一样,乘法产生的结果是四舍五入到最接近的可表示值的实数数学结果。简单地乘以 10 将试图计算数字会引入错误并给出不正确的结果。

正确的方法取决于您尝试计算 float 的十进制表示的原因,以及您有哪些关于数字边界的参数、所需的位数、十进制表示必须有多准确,等等上。

关于c - 使用 AVR-C 迭代 float 中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58778594/

相关文章:

c - L值到R值的转换

linker - AVR链接器错误 "relocation truncated to fit"

android - AVRDUDE Android Arduino ioctl 错误

c++ - 如何区分来自同一子网和不同 IP/用户的 sockaddr_in 结构

C 双向链表读访问冲突

c - C 无法识别 AVR USART 文件

USB编程

c - I2C读取时出现奇怪的延迟问题

c - 如何使用 MinGW 从 Windows XP 的 C 语言中的函数指针获取函数名称?

c - 我想检查数组中从开始到结束的所有元素(整数)是否相等