如何定义和使用小于2E-308的数字
How to define and use numbers smaller than 2e-308
最小的双为2.22507e-308。有什么办法可以使用较小的数字?我找到了一个名为GMP的库,但不知道如何使用它,文档根本不清楚,我不确定它在Windows上是否有效。
我不希望给我指示,但也许至少有一些建议。
如果您需要很大的精度,请给出gmp
机会。我确定它也可以在Windows上工作。
如果您只需要比double
更高的精度,请尝试long double
。它可能会或可能不会给您更多,取决于您的编译器和目标平台。
在我的情况下,它确实给出了更多(GCC 6,x86_64 linux):
测试程序:
#include <iostream>
#include <limits>
int main() {
std::cout << "float:"
<< " bytes=" << sizeof(float)
<< " min=" << std::numeric_limits<float>::min()
<< std::endl;
std::cout << "double:"
<< " bytes=" << sizeof(double)
<< " min=" << std::numeric_limits<double>::min()
<< std::endl;
std::cout << "long double:"
<< " bytes=" << sizeof(long double)
<< " min=" << std::numeric_limits<long double>::min()
<< std::endl;
}
输出:
float: bytes=4 min=1.17549e-38
double: bytes=8 min=2.22507e-308
long double: bytes=16 min=3.3621e-4932
如果您的编译器/体系结构允许它,则可以使用诸如long double
之类的东西,将其编译为80位浮点(尽管我认为它与128位保持一致,所以浪费了一些浪费空间),并且比典型的double
值具有更大的范围和精度。不过,并非所有的编译器都会做到这一点,在许多编译器上,long double
等于double
,在64位。
" GMP"是您可以用于扩展精度浮子的一个库。我通常建议包括GMP在内的MultipRecision,尽管个人,我会使用cpp_bin_float
或cpp_dec_float
来满足我的多重复需求(前者是IEEE756符合IEEE756,后者不是)
至于如何使用它们:我没有使用GMP,所以我无法对其语法发表评论,但是cpp_bin_float
很容易使用:
typedef boost::multiprecision::cpp_bin_float_quad quad;
quad a = 34;
quad b = 17.95467;
b += a;
for(int i = 0; i < 10; i++) {
b *= b;
}
std::cout << "This might be rather big: " << b << std::endl;
如果将编译器更改为gcc
或Intel
类型long double
将得到更大的精确(80位)的支持。借助默认的Visual Studio编译器,我没有建议您该怎么做。
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 从值小于256的uint16到uint8的Endian安全转换
- 将stl字符串缩小到小于15个字符的容量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 为什么我只能在C++中使用可变长度数组分配小于 10 mb 的内存?
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- sizeof(size_t) 可以小于 sizeof(int) 吗?
- C++:如何计算二叉树中其值模块高度小于 2 的节点数?
- unique_ptr < 0 或小于运算符做什么?
- C++模板元编程(版本小于 17,最好是 11)
- 从小于或等于某个 N 的数字列表中最小化或找到 n 个理想的子集和
- c++curl返回413请求实体过大,但是post大小远小于max大小
- 如何在随机数列表中查找大于或小于的元素
- GetWindowRect()返回的大小小于游戏的实际可见窗口的可能原因是什么
- 创建一个循环,该循环将输出大于零且小于 60(不包括 60)的所有 5 的倍数
- std::p artition 的问题,用于分离小于枢轴的元素
- 我可以写出小于 -0.5 两个 ulps 的常量表达式双精度吗?
- 数字小于机器精度的安全算术?
- 每个元素小于某个特定数字的子数组的总和
- 如何定义和使用小于2E-308的数字