[英]Compute integer bounds to include scaled floating point values
我正在嘗試計算 integer 數組邊界,其中包括浮點限制除以比例。 例如,如果我的原點是 0,我的浮點最大值是 10,那么我的 integer 數組邊界需要為 2。顯而易見的公式是將我的邊界除以比例,給出錯誤的結果 1。
我需要將包含的最大值除以比例,如果除法是精確的倍數,則添加一個。
我在定義和使用 integer 數組索引的正常方式與使用實值坐標的所需方式之間遇到了不匹配。 我正在嘗試使用縮放項將 map 包含實值坐標轉換為 integer 數組索引。
(我實際上是在使用二維地圖,但問題可以更簡單地用一維來表達。)
這是錯誤的:
int get_array_size(double, scale, double maximum)
{
return std::ceil(maximum / scale); // Fails on exact multiples
}
這是浪費:
int get_array_size(double, scale, double maximum)
{
return 1 + std::ceil(maximum / scale); // Allocates extra array memory
}
這很丑陋,我不確定它是否正確:
int get_array_size(double, scale, double maximum)
{
if (maximum % scale == 0) // I am not sure if this is correct
return 1 + std::ceil(maximum / scale);
else
return std::ceil(maximum / scale); // Maybe I can eliminate the call to std::ceil?
}
我試圖在每個以刻度倍數結束的開放式間隔上獲得最大值/刻度值,並且每個間隔上的 1 + 最大值/刻度從 >= 刻度倍數以 < 刻度倍數 + 1 結束。我不知道如何用數學術語正確表達這一點或如何在 c++ 中實現它。 如果有人能澄清我的理解並指出正確的方向,我將不勝感激。
從數學上講,我想我正在嘗試定義 f(x, s) = y st if s * n <= x and x < s * (n + 1) then y = n + 1。我想有效地實現這一點並尊重<= 和 < 比較之間的區別。
我解釋這個問題的方式,我認為maximum
和scale
實際上並不重要 - 你真正要問的是如何正確地將 map 從浮點數轉換為具有特定邊界條件的整數。 例如 [0.0, 1.0) 到 0,[1.0, 2.0) 到 1 等。所以如果我們只將maximum / scale
視為單個數量,問題就會變得更簡單一些; 我稱之為t
。
我相信您實際上想使用std::floor
而不是std::ceil
:
int scaled_coord_to_index(float t) {
return std::floor(t);
}
並且數組的大小應始終為最大縮放坐標 + 1(負值標准化為從 0 開始)。
int array_size(float min_t, float max_t) {
// NOTE: This will "anchor" your coords based on the most negative value.
// e.g. if that value is 1.6, then your bins will be [1.6, 2.6), [2.6, 3.6), etc.
// To change that behavior you could use std::floor(min_t) instead.
return scaled_coord_to_index(max_t - min_t) + 1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.