c++ - 保证 f(ULLONG_MAX) * f(ULLONG_MAX) 不大于 ULLONG_MAX 的公式
问题描述
我正在创建一个容器类,并且我想指定它的最大大小(如果乘以自身)不应超过unsigned long long
(特别是std::numeric_limits<unsigned long long>::max()
)的最大值。
假设ULLONG_MAX
是2 64 -1,这个计算有多安全,如果有必要我该如何改进它?
typedef unsigned long long size_type;
size_type max_size = size_type(std::sqrt(ULLONG_MAX)) - 1;
解决方案
2 32的平方是 2 64,太大了。
2 32 - 1 的平方等于 2 64 -2 33 +1。
所以只需使用 2 32 -1。
通常,如果是无符号整数类型,则可(static_cast<T>(1) << static_cast<T>(sizeof(T)*4)) - 1
以为您提供 type 的最大可平方无符号值。T
T
推荐阅读
- python - 为什么 Python 在不满足所有条件的情况下退出 while 循环?
- vb.net - 按 X 和 Y 属性排序列表
- c++ - 带有特征库的扰动矩阵
- javascript - 我可以用 Javascript 创建视频吗?
- java - 如何生成具有特定位范围的 SecureRandom 数
- python - pywin32的安装/卸载问题
- r - 无法对 R 中的数据框列表执行列表函数
- asp.net-mvc - Cookie 中的 ASP.net MVC 文化信息
- r - 如何将日历正确包含到我的数据集中?
- excel - 获取由另一列中的值分区的列中的唯一值,并将其扔到以逗号分隔的另一列