C ++ - 类型转换错误

时间:2013-09-03 21:34:13

标签: c++ types casting type-conversion avr

所以我在一台工作正常的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处理器的限制吗?

2 个答案:

答案 0 :(得分:2)

这是因为类型转换。

float不精确,所以当你以浮点数1 / .01和1 / .001执行时,你会略微低于100和1000.(我不想跟踪你的所有代码彻底,但这就是问题所在。)这是向下舍入到99和999,这就是为什么9s出现在输出中。

如果可以,你会更好地在整数中工作。通过将最后一个预期数字的值加一半来防止向下舍入。

您似乎期望值介于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;

答案 1 :(得分:1)

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

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