将常数双精度值映射为整数的现代方法是什么?

我希望将此作为标题仅包括在内。

我避免了#define并从if语句的嵌套开始。

我相信if语句的速度更快(我对它们进行了优先排序,并且其中有几个goto),但是下面的开关似乎更具可读性。

我看了下面的代码反汇编,这似乎很合理。

我不喜欢巨型开关。我认为可能有更好的现代方法(而不会降低性能或不需要链接)。

inline int InchtoGauge(double d)
{
    switch (static_cast<int>(d * 10000))
    {
    case 2391: return 3;
    case 2242: return 4;
    case 2092: return 5;
    case 1943: return 6;
    case 1793: return 7;
    case 1644: return 8;
    case 1495: return 9;
    case 1345: return 10;
    case 1196: return 11;
    case 1046: return 12;
    case 897: return 13;
    case 747: return 14;
    case 673: return 15;
    case 598: return 16;
    case 538: return 17;
    case 478: return 18;
    case 418: return 19;
    case 359: return 20;
    case 329: return 21;
    case 299: return 22;
    case 269: return 23;
    case 239: return 24;
    case 209: return 25;
    case 179: return 26;
    case 164: return 27;
    case 149: return 28;
    case 135: return 29;
    case 120: return 30;
    case 105: return 31;
    case 97: return 32;
    case 90: return 33;
    case 82: return 34;
    case 75: return 35;
    case 67: return 36;
    default:return -1;
    }

}

最佳答案

无论您实际上想如何使用数据,我都认为最好先以一些简单且精确的形式存储数据:

static constexpr int GaugeToInchScale = 10000;
static constexpr std::array<int, 34> GaugeToInchScaledData = { 2391, 2242, ..., 67 };
static constexpr int GaugeToInchFirstGauge = 3;


然后,任何使用此数据的功能都将以最自然的常量形式实现。

并且,如果需要,可以从该数据中合成其他表-如果需要,甚至可以as compile time constants



这是编译时间算法的一个简单示例,该算法仅生成测试相等性的if语句的线性链。这个例子的目的不是要创建一个高效的算法,而是要演示如何编写这种类型的算法。

// searcher<N>::search(x) assumes `x` doesn't appear among the first `N` entries
template< int N >
struct searcher {
    constexpr static int search(int x) {
        if (x == GaugeToInchScaledData[N]) {
            return N + GaugeToInchFirstGauge;
        }
        return searcher<N+1>::search(x);
    }
};

template<>
struct searcher<GaugeToInchScaledData.size()>
{
    constexpr static int search(int x) {
        return -1;
    }
};

int search(int n) { return searcher<0>::search(n); }

关于c++ - 将常数 double 映射为整数的现代C++方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33083040/

10-11 19:35