2011-08-25 59 views
6

C++: Thông số định dạng printf() cho float là gì? (Visual C++)C++: Thông số định dạng printf() cho "phao" là gì?

Trước đây tôi đã sử dụng %g cho float%lg cho double.

Dường như thông số đã thay đổi và float không được xác định và double%g.

Tôi có các bit trong bộ nhớ mà tôi đang in ra để việc truyền không phải là một tùy chọn.

Có cách nào để tôi có thể in ra float giá trị sử dụng printf() không?

Cập nhật:

Mã này được viết cho đơn vị thử nghiệm chung C++ libs sử dụng trên một hệ thống nhúng. Đây là những gì tôi phải làm để có được float hoạt động. Mã này là trong một mẫu chức năng:

template <typename T,typename TTYP,typename Ttyp,int bits,bool IsSigned> 
Error testMatrixT() 
{ ... 

Dưới đây là một ảnh mã:

if (typeid(Ttyp) == typeid(float)) {  
    float64 c = *(float32*)&Tp(row,col); 
    float64 a1 = *(float32*)&Arg1(row,col); 
    float64 a2 = *(float32*)&Arg2(row,col); 
    float64 e = *(float32*)&Exp(row,col); 
    m_b = (c == e); 
    _snprintf(m_acDiag, sizeof(m_acDiag)-1 
     , "add(Arg1,Arg2): arg1=%g, arg2=%g, Expected=%g, Actual=%g, Result: %s" 
     , a1, a2, e, c, BOOL_PF(m_b)); 
} else { 
    ... 

Khá xấu xí không phải là nó? Sử dụng phao như args cung cấp cho đầu ra xấu. Có thể do sử dụng _snprintf()? Năm trước tôi sẽ sử dụng %lg và nó sẽ là OK. Không còn nữa.

+1

Đây là câu hỏi thứ 3 hoặc thứ 4 tôi đã thấy, trong nhiều ngày, về việc in nổi! – Praetorian

+0

Bạn đã không đề cập đến những gì sẽ xảy ra nếu bạn sử dụng% g. Nhưng% g không phải là mặc định cho phao. – steve

+1

@steve: '% g' hoạt động cho float, vì nó được tăng gấp đôi. –

Trả lời

16

đôi và phao sử dụng specifiers định dạng tương tự với printf (%a , %e, %f%g). Điều này là do printf là một hàm variadic. Bất kỳ đối số float nào được thúc đẩy hoàn toàn để tăng gấp đôi trước cuộc gọi; bạn thực sự không thể chuyển phao sang printf.

1
printf("float: %f", floatValue); 

hoặc nếu bạn muốn ký hiệu mũ:

printf("float: %e", floatValue); 
+0

Hoặc nếu bạn muốn một trong hai điểm cố định hoặc hàm mũ: 'printf (" float:% g ", floatValue);' –

4

Với câu hỏi trong tiêu đề: Có none/"% f"

Để các câu hỏi trong nội dung thư: Có và không.

printf là hàm variadic. Tất cả các đối số float được tự động thăng cấp thành double s. Bạn in một phao bằng cách chuyển nó sang printf, nhưng không có float thực sự đạt tới hàm printf.

1

Những người khác đã chỉ ra định dạng cho in nổi bằng cách sử dụng printf, nhưng, vì bạn đang sử dụng C++, đề xuất của tôi là để tránh điều này hoàn toàn.

Sử dụng luồng C++ thay vào đó, bạn không phải lo lắng về các trình định dạng định dạng. Nó cũng là loại an toàn, trong khi printf thì không.

#include <iostream> 

int main() 
{ 
    float f = 1.234; 
    std::cout << f << std::endl; 
} 

Nếu bạn có một mảng byte có chứa phao, memcpy nó thành biến nổi và sử dụng mã ở trên.

+0

Tôi đã sử dụng luồng, nhưng tôi nghĩ đây là giải pháp tạm thời vì tôi chắc chắn rằng cuối cùng chúng tôi sẽ chạy trên một nền tảng nhúng không hỗ trợ STL. Dường như với tôi rằng nổi không được chấp nhận vì không có spec định dạng cho nó và nó không hoạt động như một arg để printf trừ khi tôi cast nó vào một đôi. –

1

%g luôn là định dạng đúng cho float hoặc double (vì đối số float được tăng gấp đôi cho các hàm variadic như printf).

%lg được thêm làm từ đồng nghĩa cho %g (trong C99, tôi không biết khi nào hoặc liệu C++ đã chấp nhận nó), có lẽ để đối xứng tốt hơn với gia đình *scanf.

$Lg dài gấp đôi.

Bạn có thể thay thế g bằng f hoặc e ở trên, tùy thuộc vào định dạng đầu ra bạn muốn.

+0

Trên nhiều hệ thống, C++ sử dụng cùng thời gian chạy như C vì vậy nếu thư viện C sử dụng chuẩn C99, thì C++ cũng vậy. – user877329

+0

@ user877329: Đúng - nhưng vẫn có các thư viện C không hỗ trợ C99 (ví dụ: Microsoft, nếu tôi không nhầm lẫn). –

Các vấn đề liên quan