使用 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) 假设我float用来保存整数值并向其添加小偏移,大约 1 秒或 2 秒。在哪个值float会停止变化?这个值的名称是什么?
当我运行此代码时:
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 中它断言)
我希望这个函数返回任何随机的双精度值,这里发生了什么?
我不明白这里发生了什么事。
我发现以下数据类型的大小(以字节为单位):
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 个字节中存储如此大的值???
假设头文件中有一个您无法控制的声明,其声明如下:
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为更低的值,那么您就引入了一个错误。
两个问题:
MaxValue是 0xffff)并包含代码(当MaxValue不是 0xffff 时)?MaxValue等于类型可以容纳的限制,是否有一种可移植的技术可用于识别类型的最大值,MaxValue如果稍后代码MaxValue发生更改,该技术将起作用?
limits.h或<limit>等常量USHRT_MAX,或未std::numeric_limits<uint16>显式使用的事件。std:numeric_limits<MaxValue> 可以使用类似的东西吗?