将常数双精度值映射为整数的现代方法是什么?
我希望将此作为标题仅包括在内。
我避免了#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/