Casting from (long)double to size_t
Casting from (long)double to size_t
我正在尝试尽可能高效地实现eratosthenes的筛子。我想将我的素数的长度设置为上限 pi(n) < 1.25506n / ln n
但是我不确定如何进行转换以安全地进行操作,也不知道哪种类型的组合是最好的。
我列表的最大长度将受到数组的最大大小的限制。
我的猜测是理想的组合取决于如何内部实现size_t和上限。
我想获得的结果很近 ceil( 1.25506n / ln n)
没有较小的数字。
有任何建议如何做?
这是一种方法:
#include <cstddef>
#include <cfloat>
#include <cmath>
std::size_t piUpperBound(std::size_t n) {
double x = n;
double num = nextafter(x, DBL_MAX);
x = log(x);
double den = nextafter(x, -DBL_MAX);
double result = num/den;
result = nextafter(1.25506, DBL_MAX)*nextafter(result, DBL_MAX);
result = nextafter(result, DBL_MAX);
return ceil(result);
}
此代码假设log
最多有1 ULP错误。
基本想法是使用nextafter
,它为我们提供了下一个可能的浮点号。每次操作后,我致电nextafter
,以某种方式修改数字,以使结果表达式保持上限。
如果我们假设该划分,乘法正确(对于IEEE-754),则可以创建更好的绑定,而不是nextafter
,我们可以调整舍入模式(始终向上或圆形)。p>注意:
- 使用
ceil
进行原始表达可能是保守的。例如,如果pi(...)= 12.2,最多有12个素数,而不是13。 - 您可以在这里看到这个公式非常保守。因此,实际上,不需要整个浮点业务。即使代码略微估计一点,它仍然会受到较大边距的上限。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 大于65535的C++数组[size]引发不一致的溢出
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 为什么(-1)%vector::size()总是返回0
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- Python str to C++ to Python str
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- 为什么铸造长可以解决"warning: cast to pointer from integer of different size"?