2009-06-18 4 views
5

tôi cần phải xác định độ dài chính xác của một chuỗi được in từ một giá trị gấp đôi, nhưng tôi không muốn hạn chế đầu ra bất kỳ hơn là cần thiết .C: có thể một đôi được khi in bao lâu qua printf()

độ dài tối đa mà một 6 chữ số chính xác kép sẽ có khi được định dạng bởi printf là gì()?

Cụ thể, những gì giá trị tôi nên đưa cho X trong printf("%X.6lg",doubleValue); để đảm bảo rằng không có giá trị bị cắt? Lý do tôi cần phải cụ thể về độ dài là tôi đang xác định một kiểu dữ liệu có nguồn gốc từ MPI được tạo thành từ nhiều biểu diễn chuỗi giá trị kép và phải biết độ dài chính xác của chúng để phân chia các vùng của tệp giữa MPI quy trình.

Tôi hy vọng điều đó rõ ràng. Cảm ơn trước vì đã trả lời.

+0

Tôi không chắc chắn bạn đang yêu cầu gì - bạn có muốn tất cả các giá trị của mình dài 6 chữ số có nghĩa không, như 0.123456, 1.23456, 12345.6, v.v ...? Hay bạn chỉ quan tâm rằng phần phân số là 6 chữ số có nghĩa? Đối với các giá trị phân số, tôi không biết làm thế nào bạn có thể tránh cắt ngắn, trừ khi các giá trị của bạn là ''dyadic' '(tức là chấm dứt nhị phân) và nhỏ hơn hoặc bằng 63/64th. –

Trả lời

6

sử dụng printf("%.6g", doubleValue) hoặc printf("%.6Lg", doubleValue)

Lưu ý rằng rời khỏi các chữ số hàng đầu (các "width") trong specifier chính xác làm cho không có nhu cầu về độ dài của phần không thể thiếu của các giá trị.

Cũng lưu ý rằng chữ cái "l" sẽ chỉ định rằng giá trị của bạn là một int dài. Chữ hoa "L" chỉ định giá trị gấp đôi dài.

Cũng lưu ý rằng nếu bạn không muốn điều này có khả năng được thay đổi thành ký hiệu khoa học (nếu nó là một biểu diễn ngắn hơn), thì bạn sẽ sử dụng "f" thay vì "g".

Xem printf reference here.

1

Có < float.h> chứa nhiều giá trị hữu ích, trong số đó có DECIMAL_DIG, dài hạn là dài gấp đôi.

Các tập tin tương tự rất có thể sẽ cho bạn biết rằng một đôi trên nền tảng của bạn có nhiều hơn 6 chữ số chính xác ...

PS: Cũng lưu ý câu trả lời của Demi trên. Anh ta chỉ ra nhiều sai sót khác nhau trong printf() của bạn đã thoát khỏi tôi.

1

Số mũ tối đa của IEEE đôi là 1023, do đó lớn gấp đôi sẽ là 1 + 1/2 + 1/4 + 1/8 + ... vv * 2^1023. Mà sẽ dài khoảng 318 ký tự, theo ký hiệu thập phân.

Tại sao không sử dụng trình định dạng định dạng "e"?

+0

Không phải tất cả nền tảng đều sử dụng IEEE đôi, đó là lý do ủy ban tiêu chuẩn đưa ra < float.h > ... – DevSolar