簡體   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