我目前使用它来遍历整数的数字,效果很好,除了单个0输入是可以预期的。
void hc595_number(unsigned int number) {
while(number) {
hc595_digit(number % 10);
number /= 10;
}
}
但是我现在无法执行的操作(因为%不使用浮点数和int值)是迭代的,对浮点数的数字是相同的。我还需要检测浮点,并对下一个数字(而不是hc595_digit
)做一些不同的操作,就像对普通数字一样。
所以,基本上对于12.4
,我需要在hc595_digit
上调用4
,然后记录下一个要点,然后对于2
,调用另一个函数。
在AVR-C中实现此目的最简单的方法是什么
基于二进制的浮点数没有您可能认为的十进制数字。
即使整数也不存储为十进制数字。它们用二进制表示。当使用% 10
和/ 10
时,您正在为它们计算十进制表示形式。 (如果它们是用小数表示的存储,C可能会需要一些运算符来访问数字,一种类似于x[3]
的下标运算符来获得x
的第三位。 ,您正在使用calculations,例如% 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将试图计算数字,这会引入错误并给出错误的结果。
正确的方法取决于您为什么要尝试为浮点数计算十进制表示形式,以及有关数字范围,所需位数的精度,十进制表示形式必须有多精确度等方面的参数? 。