data-structures - 我应该使用双数据结构来存储非常大的整数值吗?
问题描述
与double相比,int类型支持的数字范围非常小。例如,我想使用一个范围很大的整数。我应该为此目的使用 double 吗?或者是否有替代方案。
双打算术慢吗?
解决方案
与整数运算相比,双精度运算是否慢取决于 CPU 和整数/双精度的位大小。
在现代硬件上,浮点运算通常并不慢。尽管一般规则可能是整数运算通常比浮点运算快一点,但这并不总是正确的。例如,浮点数的乘法和除法甚至可以比整数对应物快得多(见这个答案)
对于没有硬件支持浮点的嵌入式系统,这可能会有所不同。那么双重算术将非常慢。
关于您最初的问题:您应该注意,64 位long long int
可以精确存储更多整数(2^63),而double
只能精确存储最多 2^53 的整数。虽然它可以存储更高的数字,但不是所有的整数:它们会被四舍五入。
浮点的好处是使用起来更方便。您有无穷大 ( Inf
) 的特殊符号和未定义 ( NaN
) 的符号。这使得除以零成为可能,而不是例外。如果出现错误或异常情况,也可以使用 NaN 作为返回值。人们经常使用整数-1
或其他东西来表示错误。这可以在未被检测到的计算中传播,而在传播时NaN
不会未被检测到。
实际示例:MATLAB 的编程语言double
作为默认数据类型。即使在通常使用整数的情况下也总是使用它,例如数组索引。尽管 MATLAB 是一种解释性语言,并且不如 C 或 C++ 之类的编译语言那么快,但它是一个非常快速且功能强大的工具。
底线:使用double
而不是整数不会很慢。也许不是最有效的,但性能损失并不严重(至少不是在现代台式计算机硬件上)。
推荐阅读
- c++ - 读取操作后堆栈粉碎
- mysql - 从查询结果中删除 null
- php - html-Form在php中不可见
- netlogo - 基于链接定位海龟
- javascript - 在从一个 Component 导航到 Second 时,前一个组件保留在 View Angular 中
- delphi - 如何在 Delphi 的 ListView 上检测单击 Item.TextButton3?
- python - 如何彻底清除所有python/conda的痕迹并重新安装?
- java - 检测直线与矩形的交点
- amazon-web-services - 没有错误,但 AWS S3 同步根本不起作用
- java - Hystrix 设置超时时,不要更改它