繁体   English   中英

C ++-类型转换错误

[英]C++ - Type conversion error

因此,我已经在可以正常工作的AVR微控制器上实现了此功能,但是当我打电话时

display(1)

4位显示屏上显示的值是“ 1.099”,而不是“ 1.000”。

void display(float n) {
int8_t i, digit_pos=0;
unsigned short digit;
PORTC &= ~((1<<MUX_A2) | (1<<MUX_B2) | (1<<MUX_E2));
ENABLE_DISPLAY;

for (i=3;i>=-3;i--)
{
    digit = n/pow(10,i);
    digit = digit%10;
    if (digit==0&&i>0&&digit_pos==0)
        continue;
    if (digit_pos-i<3)
        if (i==0)
            digit += 10;

    PORTD = SegCode[digit];
    PORTC = ((PORTC & (~(3<<MUX_A2))) | (digit_pos<<MUX_A2)) & ~(1<<MUX_E2);
    PORTC |= (1<<MUX_E2);
    if (digit_pos==3)
        break;
    else
        digit_pos++;
}

PORTD=0x00;
}

应该显示的“ n”变量是一个浮点数,因此为什么在计算过程中从第二个小数点开始丢失精度

digit = n/pow(10,i);
digit = digit%10;

是因为类型转换吗? 是否由于某些8位RISC处理器限制?

这是因为类型转换。

float是不精确的,因此当您在浮点中执行1..01和1 / .001时,您得到的值略小于100和1000。(我不想彻底地跟踪您的代码,但这就是问题所在。)这四舍五入为99和999,这就是为什么9出现在输出中的原因。

如果可以的话,最好使用整数。 通过将最后一个预期数字的一半加起来来防止舍入。

您似乎期望值在0.001到9999之间。快速实现将使用以下情况:

if (n > 9999) error
else if (n >= 1000) {dec = (int)(n + 0.5); shift = 0;}
else if (n >= 100) {dec = (int)(10*(n + 0.05)); shift = 1;}
and so on

then do stuff with dec

另一个提示,您不需要使用%运算符。 从右边计算数字并存储,然后再显示。

dec_next = dec / 10;
digit = dec - 10*dec_next;
dec = dec_next;

digit被声明为unsigned short ,因此分配给它的任何十进制值都会被截断。 您正在执行的除法将产生一个float值,您尝试将其存储为digit ,因此将其截断以存储为unsigned short

如果可以节省空间,您可能希望将digit的类型更改为float

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM