使用AVR-C迭代浮点数

问题描述 投票:0回答:1

我目前使用它来遍历整数的数字,效果很好,除了单个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中实现此目的最简单的方法是什么

c avr
1个回答
1
投票

基于二进制的浮点数没有您可能认为的十进制数字。

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

正确的方法取决于您为什么要尝试为浮点数计算十进制表示形式,以及有关数字范围,所需位数的精度,十进制表示形式必须有多精确度等方面的参数? 。

© www.soinside.com 2019 - 2024. All rights reserved.