标签: numeric-limits

为什么整数类型int64_t不保留此合法值?

我正在尝试为一些极端情况编写测试用例。对于type的输入,int64_t将不会编译以下行:

int64_t a = -9223372036854775808LL;
Run Code Online (Sandbox Code Playgroud)

错误/警告是:

error: integer constant is so large that it is unsigned [-Werror]
Run Code Online (Sandbox Code Playgroud)

我以为这个数字超出范围,所以我尝试了:

std::cout << std::numeric_limits<int64_t>::min() << std::endl;
Run Code Online (Sandbox Code Playgroud)

它输出完全相同的数字!!!因此常数在范围内。

如何解决此错误?

c++ int int64 numeric-limits c++11

10
推荐指数
2
解决办法
237
查看次数

我如何检测除了整数之外的任何东西是否被传递给我的类构造函数?

公平而简单:如何检查除整数之外的其他任何内容是否已在 C++ 中传递给我的类?

如果我通过 fe achar 'a'我的班级会得到编号97以 ascii 形式。

我试过了,std::numeric_limits但我不明白为什么它没有检测整数:

#include <iostream>
#include <limits>

class integerCheck
{
public:
    integerCheck(int value)
    {
       if((value != std::numeric_limits<int>::is_integer))
           return;

       std::cout << value << std::endl;
    }
};

int main()
{
    integerCheck valInt(88);
    integerCheck valChar('a');
    integerCheck valFloat(13.44f);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我发现这篇文章std::enable_if可以使用,但我无法想象即使在 c++20 中也无法检测到错误的输入,而是将所有内容都包装在模板中。

我错过了什么,我应该寻找/搜索什么来检测除整数值之外的任何东西? 预先感谢

c++ oop int numeric-limits c++20

9
推荐指数
2
解决办法
166
查看次数

为什么numeric_limits <T> :: min()返回最小值?

当我运行此代码时:

#include <limits>
#include <cstdio>

#define T double

int main()
{
    static const T val = std::numeric_limits<T>::min();
    printf( "%g/2 = %g\n", val, val/2 );
}
Run Code Online (Sandbox Code Playgroud)

我希望看到一个不可预测的结果.但我得到了正确的答案:

(16:53) > clang++ test_division.cpp -o test_division
(16:54) > ./test_division 
2.22507e-308/2 = 1.11254e-308
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

c++ numeric-limits

8
推荐指数
2
解决办法
390
查看次数

为numeric_limit <T> :: max()指定无限制的限制?

我有一个任意的精度Integer类,它很像Java BigInteger或OpenSSL BIGNUM在运行.我无法理解我应该如何表达无限制的限制numeric_limit<Integer>::max().

Stack Overflow有几个问题,询问它是否可以执行(比如可以将std :: numeric_limits专门用于用户定义的类似数字的类吗?),以及一些使用基元的示例的答案,但我没有看到使用任意精度整数类的示例.我还访问了std :: numeric_limits参考页面,但我不清楚在这种情况下我应该做些什么.

在这一点上,我的内容是可以专注numeric_limit于我的Integer,并且可以将它放在标准命名空间中.我还需要专注于所有人numeric_limits.

如何指定无限制的限制numeric_limit<T>::max()


以下是GCC 4.2.1 <limits>(OS X机器).

/// numeric_limits<int> specialization.
template<>
  struct numeric_limits<int>
  {
    static const bool is_specialized = true;

    static int min() throw()
    { return -__INT_MAX__ - 1; }
    static int max() throw()
    { return __INT_MAX__; }

    static const int digits = __glibcxx_digits (int);
    static const int digits10 = __glibcxx_digits10 …
Run Code Online (Sandbox Code Playgroud)

c++ numeric-limits c++03

8
推荐指数
1
解决办法
161
查看次数

val!= std :: numeric_limits <double> :: infinity()或!isinf(val)或isfinite(val)

这可能是自行车脱落,但也许有一些有趣的东西让我失踪......

如果一个类初始化一个成员val,std::numeric_limits<double>::infinity()然后想要检查val是否已被更改为有效的东西(+/- inf在这里无效),这3种方法的权衡是什么,我是否错过任何其他有趣的方法来解决这个问题.(为了便于阅读,删除了const.)

bool IsInit() { return MinX != std::numeric_limits<double>::infinity(); }  // a

bool IsInit() { return !std::isinf(MinX); }  // b

bool IsInit() { return std::isfinite(MinX); }  // c
Run Code Online (Sandbox Code Playgroud)

现在代码是C++ 03,但是如何使用C++ 11,C++ 14和C++ 17来改变选项.例如,使用C++ 17,这段代码可能就是这样std::optional<double> val.或者安静NaN是一个更安全的赌注,只是因为+/- inf在未来变得有效?

当我在阅读此代码的补丁时出现了这个问题:

为便于参考:

相关类型:

c++ nan infinity numeric-limits c++11

8
推荐指数
1
解决办法
863
查看次数

c ++中"unsigned long int"的最大值

如何从"unsigned long int"的类型中知道变量的最大可赋值是多少?

c++ numeric-limits

7
推荐指数
2
解决办法
7499
查看次数

如何在C++中将const int设置为maximum?

我有一个静态const成员,并希望将其设置为最大整数.我正在尝试以下方法:

const static int MY_VALUE = std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)

但是得到以下错误:

错误:静态数据成员的类内初始化程序不是常量表达式

这有什么解决方案吗?函数如何返回常量表达式?

编辑:添加-std = c ++ 11修复了该问题.我的室友告诉我,编译器(前C++ 11)不够聪明,不能确定std :: numeric_limits :: max()不会改变任何其他东西,因此不被认为是常量.这可能是造成这个错误的原因吗?

c++ integer const max numeric-limits

7
推荐指数
1
解决办法
1049
查看次数

std::numeric_limits 对于不专门化的类型有什么作用?

这段代码编译并运行

#include <limits>
#include <iostream>

struct Foo {
    int x;
};

static_assert(!std::numeric_limits<Foo>::is_specialized);

int main() {
    std::cout << "---" << std::endl;
    std::cout << std::numeric_limits<Foo>::lowest().x << std::endl;
    std::cout << std::numeric_limits<Foo>::min().x << std::endl;
    std::cout << std::numeric_limits<Foo>::max().x << std::endl;
    std::cout << "---" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它打印

---
0
0
0
---
Run Code Online (Sandbox Code Playgroud)

这些数字从哪里来?

在 cppreference 上我读到了

此信息是通过std::numeric_limits模板的专业化提供的。标准库为所有算术类型提供了专业化

由此我推断,缺乏对给定类型的专门化Foo意味着我不允许将其用于Foo. 那么上面的输出只是UB的一种表现吗?或者是什么?

如果我在上面的代码中更改intchar,则输出为

---
---
Run Code Online (Sandbox Code Playgroud)

这对我来说是“什么?! s 去哪里了std::endl,首先???”

c++ language-lawyer numeric-limits

7
推荐指数
2
解决办法
183
查看次数

std :: is_signed <T>和std :: numeric_limits <T> :: is_signed之间的区别?

双方std::is_signed<T>std::numeric_limits<T>::is_signed应该提供有关的符号性的答案T.
为什么现在有两个签名指标(即自C++ 11以来)?

c++ std numeric-limits c++11

6
推荐指数
1
解决办法
742
查看次数

numeric_limits 对引用类型不起作用是否有原因?

如果您错误地执行以下操作:

#include<limits>
int arr[3];
auto x  = std::numeric_limits<decltype(arr[0])>::max();
Run Code Online (Sandbox Code Playgroud)

您将从 STL 实现中的文件中获得无用的错误消息。

问题是模板参数是一个引用,所以修复是删除它:

auto x  = std::numeric_limits<std::remove_reference_t<decltype(arr[0])>>::max();
Run Code Online (Sandbox Code Playgroud)

现在我的问题是为什么numeric_limits不知道自己做这个?我明白,你不想删除pointerness(因为maxchar指针maxchar是非常非常不同的东西),但我认为,只要你有一个参考作为参数传递给numeric_limits你非常乐意与被删除它得到的结果.

c++ templates numeric-limits

6
推荐指数
1
解决办法
461
查看次数

标签 统计

c++ ×10

numeric-limits ×10

c++11 ×3

int ×2

c++03 ×1

c++20 ×1

const ×1

infinity ×1

int64 ×1

integer ×1

language-lawyer ×1

max ×1

nan ×1

oop ×1

std ×1

templates ×1