[英]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();
}
在對另一個問題的評論中,您已經被指向這篇有關浮點數的出色論文 。 這是很值得一讀。
參照您的特定問題,一種標准方法是定義一個公差 ,在此公差之間進行雙精度比較。 例如,如果您有兩個雙精度數a
和b
,並希望確定a
是否在eps
的公差內(另一個雙精度數)大於b
,則可以執行以下操作:
if (a - b > eps) {
// a is greater than b
} else {
// a is not greater than b
}
另外,如果您想知道a
等於b
在eps
指定的公差范圍內,則可以執行以下操作:
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 :: abs , std :: 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.