[英]In which condition can I compare two float variables directly using == in C++?
我知道比較兩個浮點變量非常棘手。 通常,當兩個浮點變量的差值低於閾值時,我們認為這兩個變量相等。 但是,某些情況下,直接使用==是可能的,例如,
int main()
{
float angle = 3.123f;
if(angle == 3.123f)
{
std::cout<<"the same"<<std::endl;
}
else
{
std::cout<<"different"<<std::endl;
}
angle = 13;
if(angle == 13 )
{
std::cout<<"the same"<<std::endl;
}
else
{
std::cout<<"different"<<std::endl;
}
return 0;
}
我在VC 2010中編譯代碼,似乎==
在兩種情況下都有效。 因此,我問的問題是:我們可以安全地使用==
來比較兩個變量?
我問這個問題的原因是因為我的項目中有一個函數,如下所示
void fun(int a, int b, float value=180);
void fun(int a, int b, float value)
{
if(value == 180)
{
// do something
}
else
{
// do something
}
}
基本上,在fun
函數中,有一個默認的float變量作為函數參數。 在函數實現中,我們將檢查我們是否使用默認設置,如果是,將執行特殊處理。
所有高達2 ^ 24的整數都可以表示為float
s,因此這里不會有任何問題。
不使用浮點等式的主要原因是浮點運算不精確 - (180 / 7) * 7
可能或者可能不完全等於180.但是,如果它只是作為默認參數傳遞,那么你是完全安全的。
如果您特別關注,而不是默認參數,只需輸入一個處理默認情況的雙參數重載。
當你想要它的意圖時,使用==
:完全相等的比較。 通常不適合檢查可能具有舍入誤差的不精確計算結果的完全相等,但是如果您想將某個(精確)值視為特殊情況,期望調用者將通過該(精確)值為了觸發特殊情況,那沒關系。
檢查使計算更簡單的確切值也是有意義的:例如,如果您正在實現余弦函數,您可以檢查參數是否等於(確切地)0並返回(確切地)1,跳過更復雜的數學計算一般情況下的余弦。 請注意,在這種情況下,你回來了更復雜的計算將產生相同的值,所以呼叫者不會看到這取決於他們是否通過恰好為0或一些非常接近0奇怪的行為:他們就會得到完全1或者非常接近1的東西。
顯然,相等意味着您之前比較的確切值已經分配給變量。 讓事情變得棘手的不是比較,而是浮動背后的數學。 如果指定180 ta float並將其與180進行比較,則它將始終為true。 同樣適用於分配4.15並與4.15進行比較等等。 只有在進行計算並且所涉及的值不能通過用於浮點數的二進制格式完全表示時,舍入錯誤才會起作用。
但是,在你的情況下沒有意思,因為你只想區分默認和非默認。 你應該為這種情況使用兩個函數並重載它們:
void fun(int a, int b)
{
// do the default-something
}
void fun(int a, int b, float value)
{
// do the else-something
}
該行為將在情況不同,但是在您的非默認的輸入是exaclty 180f
意外。
對於足夠小的整數,你應該非常安全。
但是,只要您比較的價值經過任何處理或轉換,所有賭注都會被取消。
這不是一個好主意。
考慮使用NaN
,無窮大或“更難”的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.