在leetcode上寫了一段**。
本來很簡單的程式始終不能最後ac
/**
* definition for a point.
* struct point
*//**
* return an array of size *returnsize.
* note: the returned array must be malloced, assume caller calls free().
*/struct point* outertrees(struct point* points, int pointssize, int* returnsize)
struct point* ret;
ret = (struct point*)malloc(sizeof(struct point)*(pointssize+1));
int i, j = 0, pushed, befpush;
double theta, maxtheta, vectorx, vectory;
ret[0].x = points[0].x;
ret[0].y = points[0].y;
pushed = 0;
for(i = 1; i < pointssize; i++)
}j++;
befpush = pushed;
pushed = 0;
if(befpush == 0) pushed = 1;
maxtheta = costhta(0, 1, (points[pushed].x - ret[j-1].x), (points[pushed].y - ret[j-1].y));
ret[j].x = points[pushed].x;
ret[j].y = points[pushed].y;
for(i = 0; i < pointssize; i++)
}if(maxtheta < theta)
}j++;
while(true)
}if(theta - maxtheta > 0.00000001)
}if( (ret[j].x == ret[0].x) && (ret[j].y == ret[0].y) )
if( maxtheta == -1)
j++;
}*returnsize = j;
return ret;
}double costhta(double x1, double y1, double x2, double y2)
後來發現問題的關鍵在於大小比較那裡。
浮點數大小比較,本來應該相同的兩個數,但由於計算誤差,導致兩者不同,更要命的是這導致其中某處判斷出了問題,將結果改變。
所以 以後浮點數的比較 double a < double b,當結果不可預期時,最好改為double b - double a > 0.00000001
浮點數比較大小
在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以 解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是 數字計算機,不是模擬機,數字機的離散化的資料表示方法自然...
浮點數比較大小
浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。單精度數7位有效數字。float 雙精度數16位有效數字。double 單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2 23 1 16777216。因為 10 7 16777216 10 8,所以說單精度浮點數的有效位數是7位。雙...
浮點數比較大小的問題
浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。單精度數7位有效數字。float 雙精度數16位有效數字。double 單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2 23 1 16777216。因為 10 7 16777216 10 8,所以說單精度浮點數的有效位數是7位。雙...