簡體   English   中英

如何在C ++中使用double / float類型設置精度

[英]How do I set precision while using type double / float in C++

在我之前的問題中, 比較了double和int,沒有進行強制轉換或轉換 ,我發現兩個double之間的差異如何使比較失敗。

我遇到了setprecision()方法,它將幫助顯示十進制后的所有數字。

因此,發現6.15和3.15之差為:3.00000000000000044408920985006

現在,當它與3進行比較時,它返回一個結果,說它大於3。

我如何強迫它只使用有限的數字?

當我使用6.1和3.1時,區別是:2.99999999999999955555579079014994

我應該如何確定精度,以便我們知道它實際上等於3,但不小於3。

希望您應該知道浮點數/雙精度數不能准確地用二進制表示,並且由於重復的小數,會發生截斷。 與帶有整數的浮點數/雙精度數的比較將始終失敗。

即使您使用setprecision也無法使用,因為它是iomanip的一種方法,用於設置顯示的精度,而不是要存儲的值。

比較雙打的可移植方式不是使用'=='運算符,而是要做類似的事情

bool Compare(double a,double b) {
    std::fabs(a - b) < std::numeric_limits<double>::epsilon();
}

您可以使用它來比較double與float和or integer。 您也可以為float編寫類似的比較功能

bool Compare(float a,float b) {
    std::fabs(a - b) < std::numeric_limits<float>::epsilon();
}

在對另一個問題的評論中,您已經被指向這篇有關浮點數的出色論文 這是值得一讀。

參照您的特定問題,一種標准方法是定義一個公差 ,在此公差之間進行雙精度比較。 例如,如果您有兩個雙精度數ab ,並希望確定a是否在eps的公差內(另一個雙精度數)大於b ,則可以執行以下操作:

if (a - b > eps) {
  // a is greater than b
} else {
  // a is not greater than b
}

另外,如果您想知道a等於beps指定的公差范圍內,則可以執行以下操作:

if (std::abs(a - b) <= eps) {
  // a and b are equal within the set tolerance
} else {
  // a and b are not equal within the set tolerance
}

正如其他人指出的那樣,C ++附帶了一些有用的功能,可以執行這些比較。 看一下std :: absstd :: numeric_limits ,以及關於SO的這篇不錯的文章

這是一個比較函數,它確定兩個數字是否在一個LSB​​之內。

bool Compare(double a, double b)
{
    return (a <= std::nextafter(b, abs(1.1*b))) && (b <= std::nextafter(a, abs(1.1*a)));
}

std::nextafter是C ++ 11的新功能,但較早的編譯器提供了版本。 請參見生成下一個最大或最小的可表示浮點數,而無需進行位擺動

setprecision可以選擇向流中吐出多少位數字。 它不決定要考慮的位數。 為了進行舍入,請使用<cmath>一個舍入函數。

實際上float和double的精度位數實際上取決於它們的大小,這就是為什么float通常比double精度差的原因。 您可以使用

    std::cout<<std::setprecision(desired no);

    float a=(desired no);

現在您已經成功設置了float的精度,對其他適當的數據類型(包括double)也可以進行相同的操作。 警告不要將精度設置為大於數據類型必須提供的精度。Double的精度為15到18位,而float的精度為6到9位。

暫無
暫無

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

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