你好,我有C++中的小區功能的一些困難:奇怪的天花板誤差
我得點的規則網格,我需要進行內插在它計算的z值一組點。
爲了做到這一點,我需要爲每個計算點獲取網格上最近的點。我這樣做:
y1 = dy*floor(p.y/dy);
y2 = dy*ceil(p.y/dy);
其中dy是網格的兩個點之間的空間。 (Y1,吡啶和dy是雙) 如果我使用顯示
cout << static_cast<double>(p.y/dy) << ": " << y1 << ", " << y2 << endl;
我有這些奇怪的結果的結果:
0: 0, 0
1: 0.1, 0.1
2: 0.2, 0.2
3: 0.3, 0.4
前三個結果是確定的,但最後一個是錯的並斷言失敗。
我想知道這個奇怪的錯誤來自哪裏以及如何避免它。 謝謝。
我爲我的英語
編輯
我打電話與DY = 0.1的功能道歉,但在執行過程中,採取瞭如下因素值DY = 0.10000000000000001。 PY被初始化這樣的:
const uint N = round((x2 - x1)/dx2);
const uint M = round((y2 - y1)/dy2);
double p = persistence;
double n = number_of_octaves;
// generation of the points where the perlin noise is generated
std::vector<Vertex3d> ret;
std::vector<Vertex3d> dummy;
for (uint i=0;i<=N;++i)
{
for (uint j=0;j<=M;++j)
{
ret.push_back({.x = i*dx2, .y=j*dy2, .z=0});
dummy.push_back({.x = i*dx2, .y=j*dy2, .z=0});
}
}
其中x1 = 0,X2 = 1(根據GDB)
..給我們在計算中使用的值(即p。y和dy) – 2013-03-08 10:25:15
除了下面給出的優秀答案之外,您可能希望看到這篇關於浮點比較的文章,因爲我確定您的代碼中存在其他潛在的錯誤。例如,你的斷言可能期待一個非常具體的值。不要這樣做! http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison – CadentOrange 2013-03-08 10:27:33
當你指的是實際的代碼,你的意思是該函數的62行,函數的48行調用這個函數和調用函數調用函數的main函數的9個函數?我向您展示的3條線之間沒有任何內容,並且所有這些值都是參數。 – 2013-03-08 11:02:14