2013-03-08 35 views
2

你好,我有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)

+0

..給我們在計算中使用的值(即p。y和dy) – 2013-03-08 10:25:15

+0

除了下面給出的優秀答案之外,您可能希望看到這篇關於浮點比較的文章,因爲我確定您的代碼中存在其他潛在的錯誤。例如,你的斷言可能期待一個非常具體的值。不要這樣做! http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison – CadentOrange 2013-03-08 10:27:33

+0

當你指的是實際的代碼,你的意思是該函數的62行,函數的48行調用這個函數和調用函數調用函數的main函數的9個函數?我向您展示的3條線之間沒有任何內容,並且所有這些值都是參數。 – 2013-03-08 11:02:14

回答

1

當使用浮點運算,則一般應不依賴於得到的結果是準確一個整數,因爲在浮點計算中不精確。您可能需要重新設計代碼,以使其不依賴於此。

這是classic discussion of floating point arithmetic

+0

@EricPostpischil,你是對的。我的語言不夠精確。 – 2013-03-08 11:38:01

-1

這看起來很像浮點運算的舍入錯誤。

這可能是因爲結果在最後一種情況是3.00000000000001所以它的上限是4不是3(然後乘以0.1)

+0

這不是劃分中的舍入錯誤。在IEEE-754浮點運算中,除非精確的商數大於三,否則將一個浮點數除以另一個浮點數絕不會產生大於三的值。 – 2013-03-08 11:25:30

+0

我從來沒有說過在這個師的過程中發生的舍入錯誤,它已經在那裏,然後在他做了ceil的時候被暴露() – CashCow 2013-04-11 09:58:36

+0

很難調和「我從來沒有說過在師的過程中發生舍入錯誤」的陳述與編輯歷史它顯示了原始語句「這看起來就像是一個浮點除法舍入錯誤的情況。」 – 2013-04-11 12:33:37

1

鑑於你的結果我想dy等於0.1

你的結果沒有錯。如果您有0.3 < p.y < 0.4,那麼您將擁有3 < p.y/dy < 4,因此ceil將爲4,而floor將爲3

也許你很困惑,因爲你的代碼中的其他地方你設置p.y爲0.3或0.4。你應該知道漂浮物是不是那麼準確。這意味着即使您設置了p.y = 0.3,它的值也可能爲0.30000001或類似的值,從而導致您的問題。

+0

其實,dy = 0.10000000000000001和py = 0.30000000000000004,但是當我調用我的函數時,我給它dy = 0.1。有沒有辦法確保dy的值是0.1? – 2013-03-08 10:58:11

+0

@AlexandreHoffmann不包含二進制浮點數,因爲它們不能準確表示'0.1'。 – 2013-03-08 11:43:21