簡體   English   中英

C++ 中浮點數的全精度顯示?

[英]Full precision display of floating point numbers in C++?

我已經閱讀了幾個關於在 C++ 中顯示浮點數的主題,但找不到令人滿意的答案。

我的問題是:如何以科學格式(尾數/指數)在 C++ 中顯示浮點數的所有有效數字?

問題是所有數字在基數 10 中的有效數字位數並不相同。

例如, double具有15 到 17 個有效十進制數字精度,但std::numeric_limits<double>::digits10返回 15,因此,對於某些數字,我將丟失 2 個額外的十進制數字精度。

std::numeric_limits<double>::digits10提供了可以安全恢復的十進制數字的數量,即在往返十進制-> double ->十進制中幸存下來的十進制數字的數量。 假設更多的十進制數字是正確的是沒有幫助的。 如果你想促進往返double ->decimal-> double你會使用std::numeric_limits<double>::max_digits10

如果您想要確切的值,您可以使用std::numeric_limits<double>::digits但它會以一種有趣的方式顯示從十進制值轉換而來的數字,因為它們通常是四舍五入的值。 這也是max_digits10在顯示供人類消費的數字時沒有用的原因:最后幾位數字通常不是人類讀者所期望的。

你看過std::max_digits10嗎?

cppreference

std::numeric_limits<T>::max_digits10是唯一表示T類型的所有不同值所需的基數為 10 的數字的數量,例如序列化/反序列化為文本所必需的。 此常量對所有浮點類型都有意義。

這意味着(以及我如何使用它)是文本輸出可以復制/粘貼到另一個程序中,並且數字將代表相同的數字

現在,我必須說我的工作馬格式總是右對齊的%23.16E ,我對最后幾位使用工程判斷。 我喜歡它,因為對於符號、指數和十六位數字就足夠了。

-----------------------
-1.1234567812345678E+12

現在,請注意精度的digits和精度的decimal digits不一定是一回事。

在 C++20 中,您將能夠使用std::format來執行此操作:

std::cout << std::format("{}", M_PI);

輸出(假設 IEEE754 double ):

3.141592653589793

默認浮點格式是具有往返保證的最短十進制表示。 與使用std::numeric_limitsmax_digits10的精度相比,此方法的優勢在於它不會打印不必要的數字。 例如:

std::cout << std::setprecision(
  std::numeric_limits<double>::max_digits10) << 0.3;

打印0.29999999999999999

std::cout << std::format("{}", 0.3);

打印0.3 ( Godbolt )。

同時,您可以使用{fmt} 庫std::format基於。 {fmt} 還提供了print功能,使這更容易和更高效( Godbolt ):

fmt::print("{}", M_PI);

免責聲明:我是 {fmt} 和 C++20 std::format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM