问题标签 [bigint]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 如果我需要一个非常大的自动增量 ID 怎么办?
根据 MySQL 网站,签名的 bigint 可以达到 18446744073709551615。如果我需要一个比自动递增主键更大的数字怎么办?
postgresql - 为什么 pg_size_pretty 返回负值?
我在玩 pg_size_pretty() 并且我发现当我传递一个很大的值时它开始返回负值。这是我的测试:
你能解释一下为什么吗?谢谢。
sql - 在 Sql server 2008 中将 nvarchar 转换为 bigint
我想将一个表的所有行插入另一个表,我还想将一个nvarchar
字段转换为bigint
,但是当我使用convert(bigint, col1)
SQL Server 时显示错误:
将数据类型 nvarchar 转换为 bigint 时出错
我该如何解决这个问题?
ruby-on-rails - rails3 bigint 主键
我想在 Rails 3 下创建一个bigint
(或string
其他不是)类型的主键字段。int
我有一个给定的数据结构,例如:
我目前正在尝试推动的方法:
列类型将是正确的,但 sqlite3 不会出现主键选项,我怀疑 MySQL 也是这种情况。
db2 - 包含 bigInt 数据类型的 db2 的第一个版本
第一个包含 BigInt 数据类型的 db2 版本是什么?
我以为是第 8 版,但我正在寻找 IBM 的官方资源。我对谷歌的运气并不好。
mysql - MySQL 中的 BIGINT 转移
大家好,我认为这可能是一个错误,但它正在杀死我。我在 Ubuntu Linux 服务器上使用 MySQL 5.1.41。我正在尝试编写一个函数来创建一个随机签名的 BIGINT 值。因为 RAND() 的精度太小,无法生成所有可能的 BIGINT 值,所以我决定尝试使用位运算符组合四个 32 位字。
我启动了 MySQL Workbench,并尝试了以下操作以查看移位运算符是否可以正确处理负数:
0x1ACE - 0x8000 是 -25906,所以如果我向左移动 16 位,我应该乘以 65536,对吗?我得到的答案是 0xFFFFFFFF9ACE0000,它是 -1697775616 或 -25906 * 65536 的有符号表示。Wunderbar,它有效!
所以我的计划是使用它来生成随机符号 BIGINT 的第一个 32 位字,并使用一个简单的循环将另外三个 32 位字添加到该值中,一次将这些位移动四个字节。令人兴奋的是,我首先将以下代码放入我的函数中,使用硬编码值来测试我的计划:
如果我设置该值以使被移动的值为正,则一切正常。但是,在使用移位的负值(在本例中为 -25906)执行此计算后,我一直得到 x 为 0x7FFFFFFFFFFFFFFF,这是有符号 64 位整数的最大正值。我完全感到困惑。完全相同的操作会产生完全不同的结果,具体取决于它是在函数中的 SET 操作中还是在 SELECT 语句中。
所以我开始搞乱 x 是签名还是未签名,事情变得非常奇怪。我尝试使 x 无符号并尝试以下操作:
当我这样做时,我得到的 x 等于零。这并不奇怪,因为 x 是无符号的并且结果是负数。但是,在云雀上,我尝试了这个:
令我惊讶的是,x 被设置为 0xFFFFFFFFFFFF9ACE!
有人可以帮忙吗?我已经在一个函数上工作了好几个小时,它只不过是有效地生成一个随机签名的 BIGINT,我很累,我越看这些东西,我就越沮丧,我对它的理解就越少. 任何帮助,无论是解释这里发生了什么,还是建议编写这个函数,以便它现在可以始终如一地工作,如果这是一个错误,如果它得到修复,在以后的版本中,将不胜感激!
algorithm - 从 10^x 到 2^x 的大整数基数/基数转换
前言
我正在通过编写和改进我自己的 BigInt 库来学习计算机数学。到目前为止,我的第一个版本将基数为 10 的数字的每个数字存储在向量的连续元素中。它可以以任意精度进行乘法和加法。我想通过转换为基数 2^x 来使用标准 C++ 数据类型中的所有可用空间来加速它。
信息
我正在从以 10 为底的标准输入读取 1000 个或更多数字,我希望将它们转换为以 2^x 为底的数字,因此我可以轻松地将它们存储在标准 C++ 数据类型之一的数组或向量中,可能是无符号整数。我对如何进行基本转换只有一个想法,即用余数重复除法。下面是一些描述该方法的 C++ 代码:
难题
我迷失的一些事情是除以余数是否是对大整数进行基数转换的正确方法。我试过看看GMP 库是如何做到的。gmp/mpn/generic/set_str.c是“魔术”发生的相关c源文件,但我不确定那里发生了什么。Matt McCutchen 的BigInt似乎使用了带余数的重复除法。如果我确实使用这种方法,我基本上需要编写我的 BigInt 类的两个版本,一个用于在 Base10 中工作,另一个用于 Base2^x。
结论
- 提供有关将大量数字从字符串转换为 32 位字数组的正确步骤的建议。
- 帮助我了解 GMP 如何将字符串转换为 32 位字数组,而无需涉足许多抽象层。
使用 4 位字长的示例
我们要存储的号码(显然在小号上):123456789
无符号字符的范围为 0-255,如果我们想拆分我们的数字并将其存储在向量中,我们可以通过以下三种方式之一进行:
- 作为基数 10,我们的向量看起来像:[1,2,3,4,5,6,7,8,9]
- 这就是我的向量在我的第一个实现中的样子。
- 作为基数 100,我们的向量看起来像:[1,23,45,67,89]
- 易于从基数 10 转换为基数 100,具有 ciel(base10/2 中的数字)元素。
- 作为基数 256,我们的向量看起来像:[7,91,205,21]
显然,第三种解决方案是内部表示的最佳解决方案,也是我想要达到的。
c++ - 对于任意精度,是否存在普遍接受的 GMP 替代方案?
在寻找 BigInt 库的过程中,我遇到了这篇文章: C or C++ BigInt library on Microsoft Windows
接受的答案提到了 GMP 库,但其中一位评论者声称该库不会非常优雅地出错,并且不适合生产代码。有人对这个库进行过长期开发吗?有什么好的选择吗?提前致谢。
fft - 如何使用 FFT 将一个非常大的整数从一个基数/基数转换为另一个?
是否有已知的算法将采用一个以一个基数/基数编码的n位数字的大整数并将其转换为另一个任意基数?(假设从 7 到 19。)n可以非常大,比如超过 100 000 位,所以我正在寻找比 O( n 2 ) 运行时间更好的东西。
我已经看到一些算法可以使用快速傅里叶变换 (FFT) 将两个大整数相乘,其理论复杂度为 O( n log n ),其中n是位数,所以我想知道基数/基数转换?
c++ - 使用进位标志的高效 128 位加法
我在我的 C++ 代码的内部循环中使用了一个 128 位整数计数器。(不相关的背景:实际应用是在规则网格上评估有限差分方程,这涉及重复递增大整数,即使是 64 位也不够精确,因为小舍入累积到足以影响答案。)
我将整数表示为两个 64 位无符号长整数。我现在需要将这些值增加一个 128 位常量。这并不难,但您必须手动捕捉从低位字到高位字的进位。
我有这样的工作代码:
这是紧凑而简单的代码。有用。
不幸的是,这大约是我运行时间的 20%。杀手锏是 loWord 测试。如果我删除它,我显然会得到错误的答案,但运行时开销会从 20% 下降到 4%!所以那个携带测试特别贵!
我的问题:C++ 是否公开了硬件携带标志,甚至作为 GCC 的扩展?如果实际编译的指令使用 add using last carry 指令进行 hiWord 添加,则似乎可以在没有上面的 test-and-add-carry 行的情况下完成添加。有没有办法重写 test-and-add-carry 行以使编译器使用内部操作码?