我正在研究项目 Euler Problem 104的问题 n\xc2\xb0104并想用 javascript 来完成。
\n\n为了解决这个问题,我需要计算斐波那契序列的大值,但是这个序列产生的数字太大,无法用经典的 Number 处理,所以我使用最新版本的 javascript 支持的 BigInt。
\n\n一旦我将特定结果存储在 BigInt 中,我需要检查它的前 10 位和最后一位数字。
\n\n为了从 Number 中获取数字,我们通常会执行如下代码所示的操作,但是当数字变得非常大时,就会出现问题:
\n\nlet number = BigInt(123456789)\r\nconsole.log(number.toString())\r\nconsole.log(number.toString()[3]) // Result is fine\r\n\r\nlet bigNumber = BigInt(1234567891111111111111111111111111111)\r\nconsole.log(bigNumber.toString())\r\nconsole.log(bigNumber.toString()[30]) // unpredictable resultRun Code Online (Sandbox Code Playgroud)\r\n似乎“toString()”方法仅使用 Number 类型的精度(我相信是 2^53),因此我们很快就会失去 BigInt 数字最后一位数字的精度。问题是我找不到其他方法来提取这些数字。
\n\n编辑: \n我需要完美的精度,因为基本上我正在做的事情是:
\n\n计算斐波那契(500) = 280571172992510140037611932413038677189525
\n\n获取该数字的最后 10 位数字:8677189525(这是丢失精度的地方)
\n\n然后为了解决我的问题,我需要检查最后 10 位数字是否包含从 1 到 9 的所有数字
\n为了好玩,我正在用 Rust 编写一个 bignum 库。我的目标(与大多数 bignum 库一样)是尽可能提高效率。我希望它即使在不寻常的架构上也能高效。
在我看来,CPU 将在具有架构的本机位数的整数上更快地执行算术运算(即,u64对于 64 位机器,u16对于 16 位机器等)因此,因为我想创建一个在所有架构上都有效的库,我需要考虑目标架构的本机整数大小。这样做的明显方法是使用cfg 属性 target_pointer_width。例如,定义最小的类型,它总是能够容纳超过最大原生 int 大小:
#[cfg(target_pointer_width = "16")]
type LargeInt = u32;
#[cfg(target_pointer_width = "32")]
type LargeInt = u64;
#[cfg(target_pointer_width = "64")]
type LargeInt = u128;
Run Code Online (Sandbox Code Playgroud)
但是,在调查此问题时,我遇到了此评论。它给出了一个架构示例,其中原生 int 大小与指针宽度不同。因此,我的解决方案不适用于所有架构。另一个潜在的解决方案是编写一个构建脚本,它编码一个LargeInt基于 a 的大小定义的小模块usize(我们可以像这样获取:)std::mem::size_of::<usize>()但是,这与上面有相同的问题,因为usize它基于指针宽度以及。最后一个明显的解决方案是简单地为每个架构保留一个本地 int 大小的映射。但是,此解决方案不够优雅且无法很好地扩展,因此我想避免使用它。
所以,我的问题是:有没有办法找到目标的本机 int 大小,最好在编译之前,以减少运行时开销?这种努力是否值得?也就是说,使用本机 int 大小与指针宽度之间是否可能存在显着差异?
我目前正在对大量数字(最多 10M 位)进行素性测试。
现在,我正在使用带有 GMP 库的 ac 程序。我使用 OpenMP 进行了一些并行化,并获得了不错的加速(4 核时为 3.5~)。问题是我没有足够的 CPU 核心来运行我的整个数据集。
我有一个 NVidia GPU,并且我试图找到 GMP 的替代方案,但适用于 GPU。它可以是 CUDA 或 OpenCL。
是否有可以在我的 GPU 上运行的任意精度库?如果有一种简单或更优雅的方法,我也愿意使用另一种编程语言。
我有以下应该转换std::array<uint8_t>为BigIntie 的代码示例boost::multiprecision::cpp_int。我使用 MSYS2 中的 clang64 15.0.7 (\xd0\xa1++17) 编译此代码。代码工作正常并将 uint8_t 数组转换为 BigInt。
#include <string>\n#include <iostream>\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing BigInt = boost::multiprecision::cpp_int;\n\nconst auto b = std::array<uint8_t, 16>{\n 0x11, 0x22, 0x33, 0x44,\n 0x11, 0x22, 0x33, 0x44,\n 0x11, 0x22, 0x33, 0x44,\n 0x11, 0x22, 0x33, 0x44\n};\n\nint main() {\n size_t shift = 0;\n auto initial = BigInt{};\n\n auto i = std::accumulate(\n b.cbegin(),\n b.cend(),\n initial,\n [&shift](const BigInt &acc, uint8_t it) {\n auto byte = BigInt{it};\n auto result = acc | (byte << …Run Code Online (Sandbox Code Playgroud) 正如你们中的一些人可能会注意到这个问题是来自Project Euler的问题16.我已经使用C#4.0的新"bigInt"功能解决了这个问题,这个功能非常简单,但也没有真正学到我应该学到的东西.我假设因为它是2 ^ 1000会有某种位移解决方案,但我无法弄清楚它究竟是如何工作的.
有没有人知道如何在不使用bigint的情况下计算2 ^ 1000?
我有一个用Node JS编写的应用程序,并使用Sequelize js ORM库来访问我的数据库MySql.
我的问题是我的数据库中有一个列是BIGINT,当它的值很大时,我检索它时会得到错误的值.
例如,当在数据库中的值是:10205918797953057我得到的10205918797953056,当我使用sequelize得到它.
我尝试使用big-integer图书馆,但我没有运气.
欢迎任何建议.
PS:我无法将数据类型更改为VARCHAR.
我真的不知道这里发生了什么.我有一个如下所示的数据库表:

有了这些数据:

当我SELECT * FROM game WHERE id = 4在phpmyadmin中运行此查询时,我按预期返回此结果:

但是当我通过rest api(其中gameId = 4)对它进行查询时
var query = connection.query("SELECT * FROM game WHERE id = ? ",[game.gameId],function(err,rows){
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果

由于某种原因,adminId被减去一个.我真的不知道发生了什么.我试过放下桌子并重新设置它,有没有人经历过这个?或者知道出了什么问题?这非常令人沮丧!谢谢
如您所知,GraphQL 没有像 long int 这样的数据类型。因此,每当数字像 一样大时10000000000,它就会抛出这样的错误:Int cannot represent non 32-bit signed integer value: 1000000000000
为此,我知道两种解决方案:
import { GraphQLScalarType } from 'graphql';
import { makeExecutableSchema } from '@graphql-tools/schema';
const myCustomScalarType = new GraphQLScalarType({
name: 'MyCustomScalar',
description: 'Description of my custom scalar type',
serialize(value) {
let result;
return result;
},
parseValue(value) {
let result;
return result;
},
parseLiteral(ast) {
switch (ast.kind) {
}
}
});
const schemaString = `
scalar MyCustomScalar
type Foo {
aField: MyCustomScalar
}
type …Run Code Online (Sandbox Code Playgroud) 我想检查一个数字是否是可接受大小的 BigInt if 语句
我知道有解决方案
function isBigInt(x) {
try {
return BigInt(x) === x; // dont use == because 7 == 7n but 7 !== 7n
} catch(error) {
return false; // conversion to BigInt failed, surely it is not a BigInt
}
}
Run Code Online (Sandbox Code Playgroud)
但我想直接在我的 if 语句中实现测试,而不是在我的函数中
有人可以帮助我吗?
在探索活动的背景下,我开始研究 32 位平台的整数和定点算术构建块。我的主要目标是 ARM32(特别是 ARM32 armv7),同时关注 RISC-V32,我预计 RISC-V32 在嵌入式领域的重要性会不断提高。我选择检查的第一个示例构建块是无符号 64x64->128 位整数乘法。本网站上有关此构建块的其他问题未提供 32 位平台的详细介绍。
在过去的三十年里,我多次实现了这个和其他算术构建块,但总是使用汇编语言,用于各种体系结构。然而,此时我的希望和愿望是这些可以直接用 ISO-C 进行编程,而不使用内在函数。理想情况下,单一版本的 C 代码将生成跨架构的良好机器代码。我知道操纵 HLL 代码来控制机器代码的方法通常很脆弱,但希望处理器架构和工具链已经足够成熟,使之变得可行。
汇编语言实现中使用的一些方法不太适合移植到 C。在下面的示例代码中,我选择了似乎适合 HLL 实现的六个变体。除了生成所有变体所共有的部分积之外,两种基本方法是: (1) 使用 64 位算术对部分积求和,让编译器负责 32 位半部分之间的进位传播。在这种情况下,有多种选择对部分乘积求和的顺序。(2) 使用32位运算进行求和,直接模拟进位标志。在这种情况下,我们可以选择在加法之后 ( a = a + b; carry = a < b;) 或加法之前 ( carry = ~a < b; a = a + b;) 生成进位。下面的变体 1 到 3 属于前一类,变体 5 和 6 属于后者。
在Compiler Explorer中,我专注于感兴趣平台的工具链 gcc 12.2 和 clang 15.0。我用 编译-O3。总体发现是,平均而言,clang 生成的代码比 gcc …