C++ 如何解决数值限制定义不一致的问题<;T>;::min()?
数字限制特征应该是获取各种类型信息的一种通用方法,以便能够执行以下操作C++ 如何解决数值限制定义不一致的问题<;T>;::min()?,c++,standard-library,C++,Standard Library,数字限制特征应该是获取各种类型信息的一种通用方法,以便能够执行以下操作 template<typename T> T min(const std::vector<T>& vect) { T val = std::numeric_limits<T>::min(); for(int i=0 ; i<vect.size() ; i++) val = max(T, vect[i]); return val; }
template<typename T>
T min(const std::vector<T>& vect)
{
T val = std::numeric_limits<T>::min();
for(int i=0 ; i<vect.size() ; i++)
val = max(T, vect[i]);
return val;
}
模板
最小温度(常数标准::向量和向量)
{
T val=std::numeric_limits::min();
对于(int i=0;i而言,解决方法是
double val = -std::numeric_limits<double>::max();
double val=-std::numeric_limits::max();
当然,这并不能解释numerics_limits::min()的奇怪行为,这可能是因为整数有不同的最小/最大边界(min=-2^n,max=2^n-1)但不适用于双精度。您可以使用Boost库。库数值转换提供了一个称为bounds的类,可以一致使用
参见文档。min()的行为并不奇怪,它返回FLT\u min
、DBL\u min
或INT\u min
(或它们各自的值),取决于您的专业类型。因此,您的问题应该是为什么FLT\u MIN
和DBL\u MIN
的定义与INT\u MIN
不同
不幸的是,我不知道后一个问题的答案
我的怀疑是,它的定义是出于实际目的。对于整数,您通常关心溢出/下溢,其中最小值和最大值成为关注点
对于浮点数,存在一种不同的下溢,即计算可能会导致大于零的值,但小于该浮点数类型的最小可表示小数。了解最小可表示浮点数可以解决此问题。另请参阅Wikipedia文章le关于数字。空向量的最小值的定义是有争议的。如果向量为空,则没有最小元素
您更愿意使用:
intmain()
{
std::向量v;
std::generate_n(std::back_inserter(v),1000,std::rand);
std::vector::iterator it=std::min_元素(v.begin(),v.end());
如果(it==v.end())
{
我不确定其基本原理,但这是预期行为。好吧,从某种意义上说,这就是约瑟蒂斯(大概是标准)对它的描述
最小值():“最小有限值(最小值
浮点的标准化值
具有非规范化的类型
尽我所能,如果类型不是整数(numeric\u limits::is\u integer
)并且具有非规范化(numeric\u limits::has\u denorm
)min()
将返回该类型可表示的最小值。否则,它将返回最小值,可能为负值
要获得更一致的接口,请查看库。特别是。下面是一个代码片段:
cout << "lowest float:" << boost::numeric::bounds<float>::lowest();
cout << "lowest int: " << boost::numeric::bounds<int>::lowest();
我经常发现,当我需要boost::numeric/conversion或boost::integer中的一种时,我需要两者。numeric\u limits::min
返回了最低的负数,所有浮点数类型,当我用Sun CC&g++尝试时,返回了最小的正数
我想这是因为“最小值”和“最小值”对浮点数的含义不同,不过有点奇怪
Sun CC和g++都产生相同的结果:
短路:最小值:-32768最大值:32767
内部:最小值:-2147483648最大值:2147483647
无符号整数:最小值:0最大值:4294967295
长:最小值:-2147483648最大值:2147483647
浮动:最小值:1.17549e-38最大值:
3.40282e+38
双:最小值:2.22507e-308最大值:
1.79769e+308
长双精度:最小值:3.3621e-4932最大值:
1.18973e+4932
无符号短路:最小值:0最大值:65535
无符号整数:最小值:0最大值:4294967295
无符号长:最小值:0最大值:429496729
模板
void showMinMax()
{
cout这是一个旧线程,但有一个更新的答案:
C++11在std::numeric_limits
()
因此,您现在可以调用std::numeric\u limits::lowest()
以获取可表示的最小负值。是std::numeric\u limits::max()==-std::numeric\u limits::min()?我不这么认为-正如我所写的,我认为对于32位数据类型,min=-2^31,max=2^31-1。这表示最大的负/正int值-gcc证实了这一点:“min:-2147483648,max:2147483647”不,我的代码是double,而不是int。对于double类型,行为不同(min给出最小的正双倍值)-这是OP的问题所在。因此,获得最大负值(预期的min行为)的解决方法是该代码。当然,这不适用于所有类型或模板,仅适用于特殊的双类型情况。Boost bounds(1.38)是关于最低的:“返回最小有限值,当T是整数类型时,它相当于numeric_limits::min(),当T是浮点类型时,它相当于-numeric_limits::max()。”奇怪的是,numeric_limits::min在这里返回一个非常小的正数(g++3.4.5)。这可能取决于版本/OS/Implementation。您的示例中有两个错误。1.函数应称为max(),因为它计算最大元素。2.行“val=max(T,vect[i])”应为“val=max(val,vect[i])”。
cout << "lowest float:" << boost::numeric::bounds<float>::lowest();
cout << "lowest int: " << boost::numeric::bounds<int>::lowest();
boost::uint_t<20>::fast fastest20bits; // fastest unsigned integer that
// can hold at least 20 bits.
boost::int_max_value_t<100000>::least // smallest integer that can store
// the value 100000.
template<typename T>
void showMinMax()
{
cout << "min: " << numeric_limits<T>::min() << endl;
cout << "max: " << numeric_limits<T>::max() << endl;
cout << endl;
}
int main()
{
cout << "short:";
showMinMax<short>()
...etc...etc..