簡體   English   中英

計算 integer 邊界以包括縮放的浮點值

[英]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。我想有效地實現這一點並尊重<= 和 < 比較之間的區別。

我解釋這個問題的方式,我認為maximumscale實際上並不重要 - 你真正要問的是如何正確地將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM