首页 > 解决方案 > 我应该使用双数据结构来存储非常大的整数值吗?

问题描述

与double相比,int类型支持的数字范围非常小。例如,我想使用一个范围很大的整数。我应该为此目的使用 double 吗?或者是否有替代方案。

双打算术慢吗?

标签: data-structuresnumbersintegerdoublec++17

解决方案


与整数运算相比,双精度运算是否慢取决于 CPU 和整数/双精度的位大小。

在现代硬件上,浮点运算通常并不慢。尽管一般规则可能是整数运算通常比浮点运算快一点,但这并不总是正确的。例如,浮点数的乘法和除法甚至可以比整数对应物快得多(见这个答案

对于没有硬件支持浮点的嵌入式系统,这可能会有所不同。那么双重算术将非常慢。

关于您最初的问题:您应该注意,64 位long long int可以精确存储更多整数(2^63),而double只能精确存储最多 2^53 的整数。虽然它可以存储更高的数字,但不是所有的整数:它们会被四舍五入。

浮点的好处是使用起来更方便。您有无穷大 ( Inf) 的特殊符号和未定义 ( NaN) 的符号。这使得除以零成为可能,而不是例外。如果出现错误或异常情况,也可以使用 NaN 作为返回值。人们经常使用整数-1或其他东西来表示错误。这可以在未被检测到的计算中传播,而在传播时NaN不会未被检测到。

实际示例:MATLAB 的编程语言double作为默认数据类型。即使在通常使用整数的情况下也总是使用它,例如数组索引。尽管 MATLAB 是一种解释性语言,并且不如 C 或 C++ 之类的编译语言那么快,但它是一个非常快速且功能强大的工具。

底线:使用double而不是整数不会很慢。也许不是最有效的,但性能损失并不严重(至少不是在现代台式计算机硬件上)。


推荐阅读