Math 编程语言如何处理大量的算术运算
对于使用64位处理器的计算机,它可以处理的最大数字是264=18446744073709551616。编程语言,比如java或C++,C++如何处理比这个值高的算术运算。任何登记册都不能将其作为一件保存。这个问题是如何解决的?一般来说,语言本身不处理高精度、高精度的大数算术。编写的库更可能使用其他数值方法来执行所需的操作Math 编程语言如何处理大量的算术运算,math,memory,numbers,integer,Math,Memory,Numbers,Integer,对于使用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