[英]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.5678eN
, 1234.5679eN
都“正確”為7位數字。
另外9.999999999
和10.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.