C++ 中乘法逆元仍然有限的最小正值是多少?
试过numeric_limits<double>::epsilon()
但事实并非如此 - 我得到了正值much比该值更小的值。
#include <limits>//is it here?
void tfuuuuu()
{
double d_eps,invd_eps;
float f_eps,invf_eps;
invd_eps = 1.0/d_eps;//invd_eps should be finite
invf_eps = 1.f/f_eps;//invf_eps should be finite
}
我怀疑是否有一个标准库函数可以查找您需要的数字,但是,使用简单的二分搜索找到所需的值并不难:
#include <iostream>
#include <cmath>
#include <typeinfo>
template<typename T> T find_magic_epsilon(T from, T to) {
if (to == std::nextafter(from, to)) return to;
T mid = (from + to)/2;
if (std::isinf((T)1.0/mid)) return find_magic_epsilon<T>(mid, to);
else return find_magic_epsilon<T>(from, mid);
}
template<typename T> T meps() {
return find_magic_epsilon<T>(0.0, 0.1);
}
template<typename T> T test_meps() {
T value = meps<T>();
std::cout << typeid(T).name() << ": MEPS=" << value
<< " 1/MEPS=" << (T)1.0/value << " 1/(MEPS--)="
<< (T)1.0/std::nextafter(value,(T)0.0) << std::endl;
}
int main() {
test_meps<float>();
test_meps<double>();
test_meps<long double>();
return 0;
}
上面脚本的输出:
f: MEPS=2.93874e-39 1/MEPS=3.40282e+38 1/(MEPS--)=inf
d: MEPS=5.56268e-309 1/MEPS=1.79769e+308 1/(MEPS--)=inf
e: MEPS=8.40526e-4933 1/MEPS=1.18973e+4932 1/(MEPS--)=inf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)