计算非常大的数字

时间:2016-04-27 19:40:02

标签: c++ c calculator

我是 - C的初学者。

我做了几次搜索,但我还没有看到这个问题。 当我尝试计算非常大的数字时(假设...添加45235432412321312到5495034095872309238)我的计算器给出了不正确的答案。 (对于我在前一句中给出的数字,我的计算器的答案是-2)。

但Linux和Windows自己的计算器都精确地计算了这些数字。

是什么原因导致我用C / C ++编写的计算器用大数字给出这些错误答案?我该怎么办来计算这些?

3 个答案:

答案 0 :(得分:2)

数字数据表示为二进制信息。因此,对于一个8位整数,您将拥有:0=00000000, 1=00000001, 2=00000010, 3=00000011,等。可以想象,数字越大,以二进制形式表示此信息所需的存储空间就越大。您的计算器会发生什么情况称为溢出,其结果数字太大而无法以二进制形式表示(没有足够的位来保存信息)。

现在,为什么要在计算机中获得准确的结果,这取决于他们的软件是如何实现的。可能的解释是它们使用更高精度的算术(它们专用更多位)使用m ultiple precision arithmetic,或者在内部执行浮点计算。我的钱将用于多种精确算术。

答案 1 :(得分:1)

简单地说,您在C和C ++中使用的内置数字数据类型(例如floatint等)因为它们被表示而受到限制有限且固定数量的比特,例如32,64等比特。你不能"东西"更多信息比32位,这是信息理论(阅读)。现在,当你添加两个"非常大"数字,由于机器表示,所谓的"溢出"发生(读取),这意味着正在创建一个位序列,因为该操作表示一个无意义的"数;如果数据类型已签名,则可能会出现负数(同样,由于内部表示)。

现在,您的计算器使用所谓的"大数字算术"或"长数字算术",在相应的库中实现。使用这种方法,数字表示为数字数组,因此几乎是无限的(当然,数组的长度也有限制,但是你可以用这种方式表示的范围比内置类型。)

总结一下,请继续阅读:

  • 信息理论
  • 二进制数系统和十进制转换< - >二进制
  • 带有签名号码的二进制算术
  • 大号算术

答案 2 :(得分:1)

简短的回答(我不确定为什么你没找到它,因为它已被多次询问):你想要一个多精度算术库,比如GMP