使用 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 有 fmodremainderremquomodf 函数,其作用类似于 % 运算符对于整数。但是,在基于二进制的浮点格式中乘以 10 是有问题的,因为与大多数浮点运算一样,乘法产生的结果是四舍五入到最接近的可表示值的实数数学结果。简单地乘以 10 将尝试计算数字会引入错误并给出不正确的结果。

正确的方法取决于您尝试计算浮点数的十进制表示的原因,以及您对数字范围、所需位数、十进制表示必须有多精确的参数,等等。