【发布时间】:2021-03-13 18:36:17
【问题描述】:
int 类型支持的数字范围非常小。例如,我想使用一个范围很大的整数。我应该为此目的使用 double 吗?或者是否有替代方案。
双打算术慢吗?
【问题讨论】:
-
请定义您所说的语言。
标签: data-structures numbers integer double c++17
int 类型支持的数字范围非常小。例如,我想使用一个范围很大的整数。我应该为此目的使用 double 吗?或者是否有替代方案。
双打算术慢吗?
【问题讨论】:
标签: data-structures numbers integer double c++17
与整数运算相比,双精度运算是否慢取决于 CPU 和整数/双精度的位大小。
在现代硬件上,浮点运算通常并不慢。尽管一般规则可能是整数运算通常比浮点运算快一点,但这并不总是正确的。例如,浮点数的乘法和除法甚至可以比整数运算快得多(参见this answer)
对于没有硬件支持浮点的嵌入式系统,这可能会有所不同。那么双重算术会非常慢。
关于您的原始问题:您应该注意,64 位 long long int 可以精确存储更多整数 (2^63),而 double 只能精确存储最多 2^53 的整数。虽然它可以存储更大的数字,但不是所有的整数:它们会被四舍五入。
浮点的好处是使用起来更方便。您有无穷大的特殊符号 (Inf) 和未定义的符号 (NaN)。例如,这使得除以零成为可能,而不是例外。如果出现错误或异常情况,也可以使用 NaN 作为返回值。对于整数,人们经常使用-1 或其他东西来表示错误。这可以在未被检测到的计算中传播,而NaN 在传播时不会未被检测到。
实际示例:编程语言 MATLAB 将double 作为默认数据类型。即使在通常使用整数的情况下也总是使用它,例如数组索引。尽管 MATLAB 是一种解释性语言,但速度不如 C 或 C++ 等编译语言快,但它是一个非常快速且功能强大的工具。
底线:使用double 代替整数不会很慢。也许不是最有效的,但对性能的影响并不严重(至少在现代台式计算机硬件上没有)。
【讨论】: