处理大量数字 C、Java、Informix

Posted

技术标签:

【中文标题】处理大量数字 C、Java、Informix【英文标题】:Handling huge numbers C, Java, Informix 【发布时间】:2009-10-14 13:32:56 【问题描述】:

我们可以处理最多 15 位数字的数字。我们需要从文本文件中解析这个值,通过 C 将它存储在 Informix 表中。还有另一个 Java 组件读取这些值、进行数学运算并计算结果。

我对此进行了一些研究,发现 Informix 提供的 int8 数据类型将是 C 的合适候选者。

关于 Java,我打算使用 BigInteger 类。

采用这种方法是否有任何陷阱。任何想法表示赞赏。

仅供参考,这是一个旧应用程序,到目前为止它一直在使用原语。此外,它只能处理基元范围内的数字。

谢谢。

【问题讨论】:

【参考方案1】:

只要您的所有数字(包括计算)保持在 15 位以下,长原语就是一个完全有效的选择,并且它具有性能和运算符的优势。 BigInteger 的缺点确实是计算的冗长/困难,你必须一直使用方法(Java 中没有运算符重载,唯一适用于对象的运算符是 + 用于字符串连接)。

在性能方面,如果不了解您的应用程序的更多信息,我不能说,但第一个假设应该是使用 BigInteger 是可以的,除非您进行其他测量。

【讨论】:

【参考方案2】:

如果您的“巨大”数字最多为 15 位十进制数字,那么long 可能是一个选项。 Java long 类型的范围为 -2**63 to +2**63 - 1。而 2**63 是 19 位十进制数字......如果我能数出来的话:-)。

当然,如果您计算的任何中间结果为 19 位或更多,long 将不起作用,您可能需要使用 BigInteger。

使用 BigInteger 没有什么特别的缺陷,只是它们比原始整数类型慢得多……而且更冗长。事实上,它们的优点是您不必再担心整数溢出。

【讨论】:

【参考方案3】:

如果您的 Informix 版本支持 BIGINT 和 BIGSERIAL,请优先使用它们而不是 INT8 和 SERIAL8。由于各种复杂的原因,INT8 和 SERIAL8 实际上在磁盘上占用了 10 个字节; BIGINT 和 BIGSERIAL 支持相同范围的值,但在磁盘上只占用 8 个字节。

如果您的 Informix 版本不支持 BIGINT 和 BIGSERIAL,请考虑升级到 IDS 11.50。

如果 Informix JDBC 驱动程序只支持 INT8,那么无论如何都要使用 INT8。

【讨论】:

谢谢。我们使用的是 IDS 版本 10.00。猜想在我们考虑升级之前,我们将不得不使用 INT8。我认为 IBM 将从 2010 年 9 月末停止支持此版本。 @Prabhur:这听起来像是一个合理的服务终止日期。【参考方案4】:

如果我理解正确,您会读取“小”值(适合 INT8 integers),然后在 Java 中进行计算,得到“大”值作为结果;对吗? 只要您不尝试将 BigInteger 值压缩到 INT8 数据类型中,对我来说就可以了。 正如 Stephen C 已经指出的那样,Java 的 long 类型也有 64 位宽度,所以这也可能是合适的。

【讨论】:

“你读取“小”值(适合 8 位整数),然后在 Java 中进行计算,得到“大”值作为结果;对吗?”并不真地。我也可以读取大值。它可以扩展到 15 位数字。是的,我不会不惜一切代价挤压它。【参考方案5】:

在 C(具体来说是 C99)中,long long 类型是一个 64 位有符号二进制整数,因此它最多可以容纳 18 位。

在 Java 中,long 类型是等效类型,即 64 位有符号二进制整数。

【讨论】:

关于 long long 的说法是对的,但是在从 int8 类型(在 DB 上)检索数据并尝试将其分配给 long long 时,它不会产生兼容性问题吗?【参考方案6】:

如果您只是使用 C 从文本文件中解析这些值,然后将它们发送到其他地方,您应该能够将它们保存为字符串。如果不自己动手,您将无法进行任何类似数学的运算,但根据您的描述,您不必这样做。

如果 C 程序中的所有数字都是 15 位字符串,那么花时间寻找二进制表示或可以对这些数字进行数学运算的库是没有意义的。

【讨论】:

以上是关于处理大量数字 C、Java、Informix的主要内容,如果未能解决你的问题,请参考以下文章

花费太多时间处理大量数字

C中的无符号整数在java中的处理

用 C 语言编写一个程序,该程序使用递归来确定一个数字是不是为素数。大量出现堆栈溢出错误

Java 基础 ------- 异常

c_cpp 找到大量数字中最大的k数。您无法对数组进行排序。

java异常处理机制详解