당신은이 라인을 따라, 당신의 부동 유형 (live example)를 일부 "측정"교체를 사용할 수 있습니다
template<typename T>
class foo
{
T val;
using lim = std::numeric_limits<int>;
static int& min_val() { static int e = lim::max(); return e; }
static int& max_val() { static int e = lim::min(); return e; }
static void sync_min(T e) { if (e < min_val()) min_val() = int(e); }
static void sync_max(T e) { if (e > max_val()) max_val() = int(e); }
static void sync(T v)
{
v = std::abs(v);
T e = v == 0 ? T(1) : std::log10(v);
sync_min(std::floor(e)); sync_max(std::ceil(e));
}
public:
foo(T v = T()) : val(v) { sync(v); }
foo& operator=(T v) { val = v; sync(v); return *this; }
template<typename U> foo(U v) : foo(T(v)) {}
template<typename U> foo& operator=(U v) { return *this = T(v); }
operator T&() { return val; }
operator const T&() const { return val; }
static int min() { return min_val(); }
static int max() { return max_val(); }
};
이 의미
int main()
{
using F = foo<float>;
F x;
for (F e = -10.2; e <= 30.4; e += .2)
x = std::pow(10, e);
std::cout << F::min() << " " << F::max() << std::endl; // -11 31
}
처럼 사용할 수 있도록 당신이 별명을 정의해야 부동 유형 (float
또는 double
)에 대해 (예 : Float
) 사용하고 프로그램 전체에서 일관되게 사용하십시오. 이것은 불편할 수 있지만 결국 유익한 것으로 판명 될 수 있습니다 (프로그램이 더 일반적이기 때문에). 당신의 코드가 이미 플로팅 타입으로 템플릿 화되어 있다면 더 좋을 것입니다.
이 매개 변수화 한 후, 당신은 할 Float
를 정의하여 "측정"또는 "릴리스"모드를 프로그램을 전환 할 수 있습니다 T
이 float
또는 double
입니다 foo<T>
또는 T
.
좋은 점은 외부 도구가 필요 없다는 것입니다. 사용자 자신의 코드가 측정을 수행합니다. 나쁜 점은 현재 설계된대로 모든 중간 결과를 포착하지 못한다는 것입니다. 이 경우 foo
에 모든 연산자 (예 : 산술 연산자)를 정의해야합니다. 이 작업을 수행 할 수 있지만 더 많은 작업이 필요합니다.
soft-float 구현을 사용할 수 없습니까? 나는 당신이 요구하는 그런 도구에 대해 모른다. –