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