簡體   English   中英

如何檢查雙精度數是否有小數部分?

[英]How can I check whether a double has a fractional part?

基本上我有兩個變量:

double halfWidth = Width / 2;
double halfHeight = Height / 2;

當它們被 2 除時,它們要么是整數,要么是小數。 如何檢查它們是整數還是 0.5?

您可以使用modf ,這應該足夠了:

 double intpart;

 if( modf( halfWidth, &intpart) == 0 )
 {
 // your code here
 }

首先,您需要確保您使用的是雙精度浮點數學:

double halfWidth = Width / 2.0;
double halfHeight = Height / 2.0;

因為其中一個操作數是雙精度數(即2.0 ),這將強制編譯器在進行數學運算之前將WidthHeight轉換為雙精度數(假設它們還不是double精度數)。 轉換后,除法將以雙精度浮點數完成。 所以它會在適當的時候有一個小數。

下一步是簡單地使用modf進行檢查。

double temp;
if(modf(halfWidth, &temp) != 0)
{
  //Has fractional part.
}
else
{
  //No fractional part.
}

您可以丟棄小數部分並使用 floor() 將結果與原始值進行比較:

if (floor(halfWidth) == halfWidth) {
    // halfWidth is a whole number
} else {
    // halfWidth has a non-zero fractional part
}

正如@Dávid Laczkó 正確指出的那樣,它是比 modf() 更好的解決方案,因為不需要額外的變量。

根據我的基准測試(Linux、gcc 8.3.0、優化 -O0...-O3),在現代筆記本和服務器處理器上, floor() 調用比 modf() 消耗更少的 CPU 時間。 啟用編譯器優化后,差異甚至會增加。 可能是因為當 floor() 只有一個參數時 modf() 有兩個參數。

暫無
暫無

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

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