Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 编程语言如何处理大量的算术运算_Math_Memory_Numbers_Integer - Fatal编程技术网

Math 编程语言如何处理大量的算术运算

Math 编程语言如何处理大量的算术运算,math,memory,numbers,integer,Math,Memory,Numbers,Integer,对于使用64位处理器的计算机,它可以处理的最大数字是264=18446744073709551616。编程语言,比如java或C++,C++如何处理比这个值高的算术运算。任何登记册都不能将其作为一件保存。这个问题是如何解决的?一般来说,语言本身不处理高精度、高精度的大数算术。编写的库更可能使用其他数值方法来执行所需的操作 例如(我现在只是编出来的),这样一个库可能会模拟实际的技术,您可能会使用这些技术手动执行大量的算术运算。这类库通常比使用内置算法慢得多,但有时需要额外的精度和准确度。您的假设是

对于使用64位处理器的计算机,它可以处理的最大数字是264=18446744073709551616。编程语言,比如java或C++,C++如何处理比这个值高的算术运算。任何登记册都不能将其作为一件保存。这个问题是如何解决的?

一般来说,语言本身不处理高精度、高精度的大数算术。编写的更可能使用其他数值方法来执行所需的操作


例如(我现在只是编出来的),这样一个库可能会模拟实际的技术,您可能会使用这些技术手动执行大量的算术运算。这类库通常比使用内置算法慢得多,但有时需要额外的精度和准确度。

您的假设是错误的。它在单个寄存器中可以处理的最大数字是64位数字。然而,通过一些智能编程技术,您可以将几十个64位数字组合成一行,生成一个巨大的6400位数字,并使用它进行更多计算。它只是没有把数字放入一个寄存器那么快

即使是旧的8位和16位处理器也使用了这种技巧,它们只会让数字溢出到其他寄存器。它使数学变得更复杂,但它并没有结束各种可能性


然而,这种高精度的数学是极不寻常的。我认为,即使你想计算美国的全部国债并将结果存储在津巴布韦元中,64位整数仍然足够大。不过,它绝对足够容纳我的储蓄账户的金额。

作为一个思维实验,想象一下以字符串形式存储的数字。使用函数对这些任意长的数字进行加法、乘法等


实际上,这些数字可能是以更节省空间的方式存储的。

将一个机器大小的数字视为一个数字,并应用小学时的多数字乘法算法。然后,您不需要将整数保存在寄存器中,只需要处理数字。

对于大于寄存器大小的数字,有许多专门的计算技术。维基百科的这篇关于


低级语言,如C和C++,将大量计算留给您所选择的库。其中一个值得注意的是。Python等高级语言将其集成到语言的核心中,因此普通数字和非常大的数字与程序员相同。

大多数语言将它们存储为整数数组。如果将这些大数字中的两个加/减,库将分别对数组中的所有整数元素进行加/减,并处理进位/借用。 这就像学校里的手动加减法,因为这是它内部的工作方式


有些语言使用实文本字符串而不是整数数组,整数数组效率较低,但更容易转换为文本表示形式。

Ada实际上在本机上支持这一点,但只支持其无类型常量(“命名数字”)。对于实际变量,您需要找到任意长度的包。请以与您大致相同的方式查看。在学校里,你会记住一位数的加法、乘法、减法和除法。然后,您学习了如何将多个数字问题作为一系列单个数字问题来处理


如果你愿意,你可以将两个二十位数的数字相乘,只需要简单算法和一位数的时间表

处理大量数字的编程语言使用自定义数字原语,这些原语超出了为32、64或128位CPU优化的正常操作。这些数字在计算机安全和数学研究中特别有用

这可能是这些方法中最完整的例子

您可以使用数组处理较大的数字。在您的web浏览器中尝试此操作。在web浏览器的JavaScript控制台中键入以下代码:

JavaScript失败的点

console.log(999999999999999 8+1)
//预计为9999999999999
//实际的100000000000000次!
JavaScript不处理
999999999999 8
以上的纯整数。但是,编写自己的数字原语是为了让这种计算变得足够简单。下面是一个使用的示例

使用自定义数字类通过测试

//需要一个自定义的类编号
常量{Num}=require('./base')
//创建大量JavaScript不会添加到的数字(正确)
const num=new num(9999999999999810)
//再加上这个庞大的数字
num.add(1)
//结果是正确的(普通JavaScript数学将失败)
console.log(num.val)//99999999999
它的工作原理

您可以查看代码中的,查看正在发生的事情的详细信息;但以下是所用逻辑的基本概述:

课程:

  • Num
    类包含一个单个
    数字
    类数组
  • 数字
    类包含单个数字的值,以及处理
    进位标志的逻辑
步骤:

  • 选定的数字将转换为字符串
  • 每个数字都被转换成一个
    digit
    类,并作为一个数字数组存储在
    Num
    类中
  • Num
    递增时,它会被带到数组中的第一个
    数字(最右边的数字)
  • 如果
    值加上
    进位标志
    等于
    ,则调用左侧下一个
    ,使其递增,并将当前数字重置为
    0