标签: numeric-limits

在 Visual Studio 2019 中使用 numeric_limits 的 C++ long double min/max 值错误

使用 Visual Studio Community 2019 v16.4.2 和它在 64 位 Win10 上附带的最新内容。

在测试各种数据类型限制时遇到了一个奇怪的错误,numeric_limits 无法区分 double 和 long double 最小/最大值。使用带有默认 GNU Mac 工具链的 NetBeans 显示更合理的结果。

    // Type limits: float
    std::cout 
        << "MIN float        " << numeric_limits<float>::min() << "\n"
        << "MAX float        " << numeric_limits<float>::max() << "\n"
        << "MIN double       " << numeric_limits<double>::min() << "\n"
        << "MAX double       " << numeric_limits<double>::max() << "\n"
        << "MIN long double  " << numeric_limits<long double>::min() << "\n"
        << "MAX long double  " << numeric_limits<long double>::max() << "\n"; …
Run Code Online (Sandbox Code Playgroud)

c++ long-double numeric-limits

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

什么最大整数,能够加 1 浮点类型可以在 C++ 中保存?

假设我float用来保存整数值并向其添加小偏移,大约 1 秒或 2 秒。在哪个值float会停止变化?这个值的名称是什么?

c++ floating-point types terminology numeric-limits

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

std::uniform_real_distribution 总是返回无穷大

当我运行此代码时:

double getRandomDouble() {
    static std::mt19937 entropy_ = std::mt19937();
    std::uniform_real_distribution<double> distribution;
    distribution.param(typename decltype(distribution)::param_type(std::numeric_limits<double>::lowest(),
                                                                   std::numeric_limits<double>::max()));
    return distribution(entropy_);
}
Run Code Online (Sandbox Code Playgroud)

它总是返回无穷大(至少在 GCC8.1 和 clang 11.0.1 中。在 MSVC 14.16.27023 中它断言)

这是 GodBolt 中的一个工作演示

我希望这个函数返回任何随机的双精度值,这里发生了什么?

c++ random numeric-limits

0
推荐指数
1
解决办法
98
查看次数

在 C++ 中,double 能在 8 个字节中存储 1024 位吗?

我不明白这里发生了什么事。

我发现以下数据类型的大小(以字节为单位):

char:1
int:4
float:4
double:8
long long int:8

Now long long int max size is 9223372036854775807
whereas double max size is 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
Run Code Online (Sandbox Code Playgroud)

什么!!!

double 先生如何在短短 8 个字节中存储如此大的值???

c++ numeric-limits

-2
推荐指数
1
解决办法
1613
查看次数

在C++中,如何通过变量名来表达类型的最大可能值?

假设头文件中有一个您无法控制的声明,其声明如下:

static const uint16 MaxValue = 0xffff;  // the type could be anything, static or not 
Run Code Online (Sandbox Code Playgroud)

在包含上述内容的文件中,您有如下代码:

int some_function(uint16 n) {
   if (n > MaxValue) {
     n = MaxValue;
   }
   do_something(n);
   ...
}
Run Code Online (Sandbox Code Playgroud)

编译器会警告 if 语句始终为 false,因为n不能大于 0xffff。

一种方法可能是删除代码。但是,如果后来有人想将 的值更改MaxValue为更低的值,那么您就引入了一个错误。

两个问题:

  • 是否有任何 C++ 模板或技术可用于确保在不需要时删除代码(因为MaxValue是 0xffff)并包含代码(当MaxValue不是 0xffff 时)?
  • 假设您想显式编写一个额外的检查来查看是否MaxValue等于类型可以容纳的限制,是否有一种可移植的技术可用于识别类型的最大值,MaxValue如果稍后代码MaxValue发生更改,该技术将起作用?
    • 含义:如何通过变量名称推断类型的最大值?
      • 我宁愿不使用limits.h<limit>等常量USHRT_MAX,或未std::numeric_limits<uint16>显式使用的事件。
      • std:numeric_limits<MaxValue> 可以使用类似的东西吗?

c++ numeric-limits

-2
推荐指数
1
解决办法
248
查看次数