簡體   English   中英

檢查答案是否正確到小數點后7位

[英]Checking if an answer is correct to 7 decimal places

因此,我正在執行此項目,在該項目中,必須使用二進制搜索將值插入公式中,並檢查輸出是否大致等於我的鍵。 因為我要插入的該公式與圓的面積有關,所以我需要它與鍵近似等於小數點后7位。

double binarySearch(min, max, key){
   int mid;
   if(max > min)
   {
       mid = (1 + (max-min)/2)/1;

       if(funtion(mid) == key)
       {
           return mid;
       }
       if(function(mid) > key)
       {
           return binarySearch(min, mid-1, key);
       }
       if(function(mid) < key)
       {
           return binarySearch(mid+1, max, key);
       }

       return -1;
    }
}

所以我知道檢查if(function(mid)== key)是毫無意義的,因為它永遠不會完全相等。 我只是不確定如何返回精確到小數點后7位(或近似等於我們的鍵)的答案。

可能有幾種方法,一種是檢查差異是否小於錯誤,例如:

if(fabs(mid - key) <= 1e-7 ) {
   return mid;
}

這仍然不完全正確,因為浮點變量也可以是無窮大, NaN和非正規的。 如果您有一個不錯的數學庫(> = C99),則可以(並且應該)使用islessequal()代替。

您可以執行function(mid) * pow(10, 7) ,它將向左移動7個十進制數字。

10.12345678 * 10^7 = 101234567.8

然后,您可以將結果轉換為integer ,以便忽略其余的十進制數字。

檢查答案是否正確到小數點后7位

讓我們指定正確的7位小數 是小數點后7位還是7位有效數字?

如果要“小數點后7位”,請考慮@deamentiaemundi 請注意,對於非常小的min,key例如1e-10、1e-20,這將始終為真。 對於min,key非常大且相異的min,key (即使有一點也一樣)將始終為false,例如1.0e10、1.00000000001e10。


對於浮點數,通常需要查找7個有效數字。

則無論N的值如何, 1234.5678eN1234.5679eN都“正確”為7位數字。

另外9.99999999910.0被“正確”為7位數字,相差0.000000001。

由於OP正在尋找該區域,因此讓我們假設min,key均為正。 (零和混合符號需要附加代碼。

找到相對差異。

bool close_enough(double min, double key) {
  if (min == key) {
    return true;
  }
  if (min < 0.0 != key < 0.0) {
    // Handle different signs
    // this is usually false, but you may want something different.
    return false;   
  }
  double dif_abs = fabs(min - key);
  double average = fabs((min + key)/2);
  double dif_rel = dif_abs/average;
  return (dif_rel <= 1.0e7);
}

其他問題包括非數字,無窮大==無窮大,0和較小的值, min + key可能會溢出。 但這應該從頭開始。

這有點hacky,但是您可以使用snprintf()將浮點值作為字符串打印為7位小數,然后使用strncmp()比較字符串。 希望能有所幫助。

暫無
暫無

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

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