我目前使用它来迭代整数的数字 效果很好,除了单个 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有fmod
、remainder
、remquo
、modf
函数其作用类似于整数的 %
运算符。但是,在基于二进制的浮点格式中乘以 10 是有问题的,因为与大多数浮点运算一样,乘法产生的结果是四舍五入到最接近的可表示值的实数数学结果。简单地乘以 10 将试图计算数字会引入错误并给出不正确的结果。
正确的方法取决于您尝试计算 float 的十进制表示的原因,以及您有哪些关于数字边界的参数、所需的位数、十进制表示必须有多准确,等等上。
关于c - 使用 AVR-C 迭代 float 中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58778594/