std::numeric_limits 提供2个互斥的常量:
is_integer :" true对于所有整数算术类型T"
is_exact:" true对于T使用精确表示的所有算术类型"
是否存在非精确积分类型的可能性?在这里试图允许什么?
在我所有的模板中,我知道我是否正在处理精确的数字,我用过is_integer,我现在还需要添加支票is_exact吗?
我有以下代码:
#include <iostream>
#include <limits>
int main()
{
std::cout << std::numeric_limits<unsigned long long>::digits10 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么两者之间有区别?无论编译器如何,我都希望这样的常量是相同的.
在我的应用程序(在Visual C++ 2010下编译)中,我在头文件中有这样的代码:
// example.h
#pragma once
#include <limits>
namespace myspace
{
// A generic equality test
template<typename T> inline bool equal(
const T &v1,
const T &v2,
const T &eps = std::numeric_limits<T>::epsilon())
{
return (v1 == v2);
}
// Template specialization for floating-point numbers
template<> bool equal<float>(
const float &v1,
const float &v2,
const float &eps);
// A generic equality test for finite-precision real number representations (with epsilon)
template<typename T> inline bool realEqual(
const T &p,
const T &q, …Run Code Online (Sandbox Code Playgroud) 我是SO的新手,这是我的第一个问题,但我已经阅读了规则,我希望我不会破坏它们中的任何一个.
我最近开始学习编程,并选择C++作为我的第一语言.今天我已经到了需要帮助才能做出正确决定的地步.我正在学习第六版C++ Primer Plus,到目前为止,作者只介绍了C宏,并且没有说过关于numeric_limits模板的一个单词(至少我认为它是一个模板),我从互联网上学到了我的好奇心.
所以,现在我有点迷失,因为如果我理解正确,numeric_limits是一种检查C++类型限制的现代方法,因为它易于扩展.此外,C宏中的AFAIK没有像char16_t这样的C++ 11类型的定义.
虽然只搜索我发现的那个问题,但提供的答案虽然有用,但不幸的是他们没有回答对我来说特别有趣的事情.实际上他们大多都很老了.
现在,具体问题:
基于对代码执行速度的需求,未来的安全性和实用性(我不太关心简单性)是否更好的想法使用那些旧的C宏,还是应该考虑我提到的方面坚持使用numeric_limits?
请原谅我英语中的任何错误.这不是我的母语.
至少在我自己的脑海中,我遇到了一些奇怪的行为,同时调试了一些涉及确定添加操作是否会使double下溢的代码.这是一个展示我发现的示例程序.
#include <iostream>
#include <limits>
using std::cout;
using std::endl;
using std::numeric_limits;
int main()
{
double lowest = numeric_limits<double>::lowest();
bool truth = (lowest + 10000) == lowest;
cout << truth << endl;
}
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时,我得到了结果.这是一个错误还是我只是被剥夺了睡眠?
如果可以输出一个浮点数,以便没有截断值(比如说setpercision),并且数字以固定的表示法输出(比方说fixed),保证整个小数部分所需的缓冲区大小是多少.浮点数可以存储在缓冲区中吗?
我希望标准中有#define一些东西numeric_limits可以告诉我浮点类型的小数部分的最大基数为10的位置.
我在这里询问浮点类型的小数部分中的最大基数为10的数字:浮点数的积分部分中的最大基数为10的数字是多少
但我意识到这可能会更复杂.例如,1.0 / 3.0是一系列无限重复的数字.当我使用fixed格式输出时,我会在重复0之前得到这么多地方:
0.333333333333333314829616256247390992939472198486328125
但我不一定能说这是最大精度,因为我不知道有多少尾随0实际上是在浮点的分数中表示的,并且它没有被负指数向下移动.
我知道我们min_exponent10应该为此寻找什么?
IEEE浮点指数存储为无符号整数,使用预定义的指数偏差来抵消指数.
该指数偏见似乎始终等于numeric_limits<T>::max_exponent - 1其中T是浮点类型.
我没有任何文档表明这总是正确的,但我当然对非IEEE浮点格式没有任何想法.
这必须为以下功能所知:
难道C++有一个规范,或者我必须承担numeric_limits<T>::max_exponent - 1?
你会如何修复这段代码?
template <typename T> void closed_range(T begin, T end)
{
for (T i = begin; i <= end; ++i) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
T被约束为整数类型,可以是更广泛的类型,可以是有符号或无符号的
begin 可 numeric_limits<T>::min()
end可以numeric_limits<T>::max()(在这种情况下++i会溢出上面的代码)
我有几种方式,但我不喜欢.
我理解为什么C++将INT_MIN定义为(-2147483647-1),但为什么它们不使用1 << 31?这样可以防止溢出并且易于理解.
Limits 是 C++ 中的头文件,由numeric_limitsclass组成,而 climits 是仅由各种数据类型的最小值和最大值组成的头文件。
可以在任何想要使用 climits 的地方使用限制,但与此相反的是不正确的。
因此,何时建议使用 climits 以及何时使用限制?
c++ ×10
numeric-limits ×10
c++11 ×2
decimal ×1
digits ×1
double ×1
exponent ×1
fixed-point ×1
gcc ×1
integer ×1
limit ×1
max ×1
overflow ×1
unsigned ×1
visual-c++ ×1