limits.h指定非浮点数学类型的限制,例如INT_MIN和INT_MAX.这些值是您可以使用int表示的最负面和最正面的值.
在float.h有相关定义FLT_MIN和FLT_MAX.如果您执行以下操作:
NSLog(@"%f %f", FLT_MIN, FLT_MAX);
Run Code Online (Sandbox Code Playgroud)
您将获得以下输出:
FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000
Run Code Online (Sandbox Code Playgroud)
FLT_MAX等于一个非常大的数字,正如你所料,但为什么FLT_MIN等于零而不是一个非常大的负数?
我在我的mac/xcode上编译了这个代码,没有任何问题.我在学校用linux上的g ++编译它,我得到这些错误:
:'numeric_limits'不是std的成员
:'>'标记之前的预期primary-expression
:没有用于调用'max()'的匹配函数
#include <iostream>
#include <cstdlib>
using namespace std;
int GetIntegerInput(int lower, int upper)
{
int integer = -1;
do
{
cin >> integer;
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); //errors here
}while (integer < lower || integer > upper);
return integer;
}
Run Code Online (Sandbox Code Playgroud)
我猜对了也许我必须加一个额外的标题.如果我带走了std ::它只是给了我一个类似的错误
'numeric_limits'未在此范围内声明
我创建了自己的类型,没有任何比较器,没有专业化std::numeric_limits.尽管如此,由于某种原因,std::numeric_limits<MyType>编译好.为什么c ++标准委员会定义numeric_limits模板,使其对所有类型都有效,包括非数字类型?
示例代码如下:
#include <iostream>
#include <limits>
using namespace std;
// This is an int wrapper that defaults to 666 instead of 0
class A {
public:
int x;
public:
A() : x(666) {}
};
int main() {
A a = std::numeric_limits<A>::max();
A b = std::numeric_limits<A>::max();
std::cout << a.x << "\n" << b.x;
// your code goes here
return 0;
}
Run Code Online (Sandbox Code Playgroud) 通常,我可以引用limits.h来查看特定类型的最大值,例如int或long.
在Qt中,有类似qlonglong的类型.是否有一个头文件和/或文档可以类似的方式用于手动或以编程方式引用这些类型的限制?
我正在尝试创建一个等于Inf + Inf*j的复数无穷大,其中j是复数变量.当我这样做:
#include <complex>
#include <limits>
using std;
...
complex<double> attempt1 =
complex<double>( numeric_limits<double>::infinity(),
numeric_limits<double>::infinity() );
Run Code Online (Sandbox Code Playgroud)
返回复数(NaN + Inf*j).
但
complex<double> attempt2 =
complex<double>( numeric_limits<double>::infinity() );
Run Code Online (Sandbox Code Playgroud)
返回复数(Inf + 0*j).
另外:
complex<double> attempt_at_imag_inf =
complex<double>(any_value_here, numeric_limits<double>::infinity());
Run Code Online (Sandbox Code Playgroud)
返回复数(NaN + Inf*j).
有谁知道这里发生了什么?任何时候我试图为想象的部分提供信息,那么NaN就写在真实的部分上.
以上仅适用于支持NaN和Infinity的类型.我正在使用g ++ v4.6.1.我查看了numeric_limits标题,并没有迹象表明上面应该发生.
为了将上述内容置于上下文中,我实际上是在对numeric的一个部分特殊化中执行上述操作.非常感谢您考虑这个问题.
修改原始邮政
我正在提供一个完整但很短的程序来说明问题.我还提供了一些关于如何编译程序以生成结果的更多合格信息.
#include <iostream>
#include <complex>
#include <limits>
using namespace std;
int main(int argc, char* argv[])
{
complex<double> my_complex_inf =
complex<double>(numeric_limits<double>::infinity(),
numeric_limits<double>::infinity());
cout << "my_complex_inf = " << my_complex_inf << endl;
complex<double> attempt2 =
complex<double>( numeric_limits<double>::infinity() …Run Code Online (Sandbox Code Playgroud) 我说了两件事:
std::numeric_limits<float>::max()+(a small number) 给: std::numeric_limits<float>::max().
std::numeric_limits<float>::max()+(a large number喜欢:std::numeric_limits<float>::max()/3) 给 inf.
为何如此区别?1或2会导致OVERFLOW导致未定义的行为吗?
编辑:测试此代码:
1.
float d = std::numeric_limits<float>::max();
float q = d + 100;
cout << "q: " << q << endl;
Run Code Online (Sandbox Code Playgroud)
2.
float d = std::numeric_limits<float>::max();
float q = d + (d/3);
cout << "q: " << q << endl;
Run Code Online (Sandbox Code Playgroud) 这里有一些代码可能会起作用:
#include <cassert>
#include <limits>
enum test { A = 1 };
int main()
{
int max = std::numeric_limits<test>::max();
assert(max > 0);
}
Run Code Online (Sandbox Code Playgroud)
但它在Linux上的GCC(4.6.2)和clang(2.9)都失败了:枚举类型的max()实际上是零!即使您使用C++ 11枚举类型说明符来明确说明您希望枚举具有哪种类型,这仍然是正确的.
为什么是这样?至于C++ 11的行为,它是否被明确要求?我在N2347中没有提到它,这是关于强类型枚举的论文.
为什么std::numeric_limits在C++ 的模板类中,digits(和其他)被定义为类的(静态const)字段,但是min()并且max()是方法,因为这些方法只返回一个小的值?
提前致谢.
我对什么max_digits10代表感到困惑.根据其文档,对于所有整数类型,它为0.浮点类型的公式max_digits10看起来类似于int's digits10'.
正如我解释它,MSDN的定义的numeric_limits::is_exact几乎都是假的:
在[this]类型上完成的[all]计算没有舍入误差.
而IBM的定义几乎总是正确的:(或圆形的定义,这取决于你怎么看它)
一种对其所有值都有精确表示的类型
我确定的是,我可以2在a double和a中存储一个,long而且它们都可以完全代表.
然后,我可以将它们分开,10并且两者都不会完全保持数学结果.
给定任何数值数据类型T,定义的正确方法是std::numeric_limits<T>::is_exact什么?
编辑:我已经从许多答案中提供的详细信息中发布了我认为对此问题的准确答案. 这个答案不是赏金的竞争者.