cuốn sách gpt4 ai đã làm

In số thập phân vòng lặp nhanh (được nhúng)

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 04:37:00 26 4
mua khóa gpt4 Nike

Trong chương trình cơ sở bộ xử lý nhúng thời gian thực của tôi, tôi cần in các số thập phân được định dạng. printf/sprintf tiêu chuẩn không có sẵn trong chuỗi công cụ, vì vậy tôi cần phải tự mình triển khai nó.

Tôi đã sử dụng phương pháp đơn giản là chia cho 10 và lấy phần còn lại. Nhưng bộ xử lý mục tiêu của tôi không hỗ trợ phân chia nguyên bản và việc triển khai phần mềm mất nhiều thời gian (hơn 200us) để tính toán. Tôi tự hỏi liệu có cách nào nhanh chóng để lấy số thập phân từ một số mà không chia không?

char* os_prn_decimal(char* outBuf, const char* end, uint32 v)
{
uint32 dgtIdx = 1000000000;

do
{
uint8 dgt = (uint8)(v / dgtIdx);

*outBuf = dgt + '0';
++outBuf;

v = v %dgtIdx;
dgtIdx /= 10;
} while (outBuf < end && dgtIdx > 0);
return outBuf;
}

câu trả lời hay nhất

Giải pháp của bạn trực tiếp tạo ra các số theo đúng thứ tự, nhưng phải trả giá bằng việc chia biến (v/dgtIdx), mô đun thay đổi (có giá bằng hoặc nhiều hơn phép chia) và chia cho 10. Đây là ba hoạt động tốn kém.

Có thể rẻ hơn nếu tạo số từ bit có trọng số nhỏ nhất trước rồi đảo ngược số. Sau đó chỉ cần chia cho 10 và modulo 10. sử dụng Chia cho 10 bằng cách sử dụng dịch chuyển bit? nghiệm tại và sửa đổi nó để thu được số dư trong cùng phép toán với thương:

uint32_t div10_rem( uint32_t cổ tức, int* dư)
{
thương số uint32_t = (uint32_t)((0x1999999Aull * cổ tức) >> 32);
*số dư = cổ tức - (thương * 10);

thương số trả về;
}

Sau đó chuyển đổi thành chuỗi thập phân có thể hiển thị có thể là:

char* int2dec( uint32_t val, bộ đệm char*)
{
char đảo_chữ số[10] = {0};
uint32_t u = val;
size_t chữ số_count = 0;

trong khi( u > 0 )
{
int d = 0;
u = div10_rem(u, &d );
Reverse_digits[digit_count] = d + '0' ;
chữ số_count++;
}

đệm[digit_count] = '\0' ;
size_t tôi = 0;
for( size_t i = 0; i < chữ số_count; i++ )
{
bộ đệm[i] = Reverse_digits[digit_count - i - 1];
}

trả về bộ đệm;
}

Sau đó, một cách sử dụng ví dụ:

    bộ đệm char [11];
printf( "%s", int2dec(val, buffer) ) ;

Nếu sử dụng bộ đệm tĩnh là phù hợp, bạn có thể tránh đảo ngược số:

#defineMAX_DIGITS 10
const char* int2dec(uint32_t val)
{
chữ số char tĩnh[MAX_DIGITS + 1] = {0};
uint32_t u = val;
size_t chữ số_index = MAX_DIGITS - 1;

trong khi( u > 0 )
{
int d = 0;
u = div10_rem(u, &d );
chữ số[digit_index] = d + '0';
chữ số_index--;
}

trả về &chữ số[digit_index + 1];
}

Sau đó, ví dụ:

    printf( "%s", int2dec(val ) ) ;

Về thuật toán - in số thập phân trong vòng lặp nhanh (được nhúng), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/57842331/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress