使用 AVR-C 迭代浮点数中的数字
Iterating over digits in a float with AVR-C
我目前使用它来迭代整数的数字 效果很好,除了单个 0 输入,这是可以预料的。
void hc595_number(unsigned int number) {
while(number) {
hc595_digit(number % 10);
number /= 10;
}
}
然而,我现在没有做的(因为 % 不采用浮点数和整数)是迭代的,与浮点数的数字相同。我还需要检测浮点数并为下一个数字做一些不同的事情,而不是 hc595_digit
,就像我可以为普通数字做的那样。
所以,基本上 12.4
,我需要在 4
上调用 hc595_digit
,然后记录下一个点,然后 [=15] =], 调用不同的函数。
在 AVR-C 中实现它的最简单方法是什么
基于二进制的浮点数并不像您想象的那样有十进制数字。
即使是整数也不会存储为十进制数字。它们用二进制表示。当您使用 % 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 将尝试计算数字会引入错误并给出不正确的结果。
正确的方法取决于您尝试计算浮点数的十进制表示的原因,以及您对数字范围、所需位数、十进制表示必须有多精确的参数,等等。
我目前使用它来迭代整数的数字 效果很好,除了单个 0 输入,这是可以预料的。
void hc595_number(unsigned int number) {
while(number) {
hc595_digit(number % 10);
number /= 10;
}
}
然而,我现在没有做的(因为 % 不采用浮点数和整数)是迭代的,与浮点数的数字相同。我还需要检测浮点数并为下一个数字做一些不同的事情,而不是 hc595_digit
,就像我可以为普通数字做的那样。
所以,基本上 12.4
,我需要在 4
上调用 hc595_digit
,然后记录下一个点,然后 [=15] =], 调用不同的函数。
在 AVR-C 中实现它的最简单方法是什么
基于二进制的浮点数并不像您想象的那样有十进制数字。
即使是整数也不会存储为十进制数字。它们用二进制表示。当您使用 % 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 将尝试计算数字会引入错误并给出不正确的结果。
正确的方法取决于您尝试计算浮点数的十进制表示的原因,以及您对数字范围、所需位数、十进制表示必须有多精确的参数,等等。