Vì bạn đang sử dụng nền tảng nhúng, bạn hoàn toàn có thể không có đầy đủ các chức năng từ các chức năng kiểu printf()
.
Giả sử bạn có nổi ở tất cả (vẫn không nhất thiết là một trao cho các công cụ nhúng), bạn có thể bắt chước nó với một cái gì đó như:
char str[100];
float adc_read = 678.0123;
char *tmpSign = (adc_read < 0) ? "-" : "";
float tmpVal = (adc_read < 0) ? -adc_read : adc_read;
int tmpInt1 = tmpVal; // Get the integer (678).
float tmpFrac = tmpVal - tmpInt1; // Get fraction (0.0123).
int tmpInt2 = trunc(tmpFrac * 10000); // Turn into integer (123).
// Print as parts, note that you need 0-padding for fractional bit.
sprintf (str, "adc_read = %s%d.%04d\n", tmpSign, tmpInt1, tmpInt2);
Bạn sẽ cần phải hạn chế bao nhiêu ký tự đến sau khi thập phân dựa trên các kích thước của các số nguyên của bạn.Ví dụ, với một số nguyên có dấu 16 bit, bạn bị giới hạn ở bốn chữ số (9,999 là số nguyên lớn nhất của mười chữ số có thể được biểu diễn). Tuy nhiên, có nhiều cách để xử lý điều này bằng cách xử lý thêm phần phân số, chuyển nó bằng bốn chữ số thập phân mỗi lần (và sử dụng/trừ phần nguyên) cho đến khi bạn có độ chính xác mong muốn.
Cập nhật:
Một điểm cuối cùng bạn nói rằng bạn đang sử dụng avr-gcc
trong một phản ứng với một trong những câu trả lời khác. Tôi đã tìm thấy trang web sau đây có vẻ như mô tả những gì bạn cần làm để sử dụng %f
trong các tuyên bố printf()
here của mình.
Như tôi đã nghi ngờ ban đầu, bạn cần thực hiện thêm một số bước chân để có được hỗ trợ điểm nổi. Điều này là do công cụ nhúng hiếm khi cần điểm nổi (ít nhất là không có thứ gì tôi từng làm). Nó liên quan đến việc thiết lập các tham số bổ sung trong makefile của bạn và liên kết với các thư viện phụ.
Tuy nhiên, điều đó có khả năng tăng kích thước mã của bạn khá nhiều do cần phải xử lý các định dạng đầu ra chung. Nếu bạn có thể hạn chế đầu ra float của bạn đến 4 chữ số thập phân hoặc ít hơn, tôi khuyên bạn nên chuyển mã của tôi thành một hàm và chỉ sử dụng nó - nó có khả năng chiếm ít chỗ hơn.
Trong trường hợp liên kết bao giờ biến mất, những gì bạn phải làm là đảm bảo rằng lệnh gcc của bạn có "-Wl,-u,vfprintf -lprintf_flt -lm
" Điều này được chuyển tới:.
- lực vfprintf được ban đầu không xác định (do đó mối liên kết có để giải quyết nó).
- xác định nổi thư viện điểm
printf()
để tìm kiếm.
- định thư viện toán học để tìm kiếm.
gì C-thư viện được bạn liên kết chống lại? – sybreon
Lưu ý rằng bạn đang cố gắng định dạng gấp đôi. Với varargs trình biên dịch sẽ tự động thúc đẩy một giá trị float để tăng gấp đôi. – Richard
"Đã nhúng", các bạn. Đó là chìa khóa. Nó không quan trọng những gì thư viện ưa thích của bạn shmancy làm trên máy tính của bạn với GB bộ nhớ :-) Embedded nền tảng thường có thương mại-offs hướng tới dấu chân bộ nhớ tối thiểu. – paxdiablo