我在处理C#中的值时应该使用什么,这对于SQL Server数据库来说是个bigint?
Rust具有128位整数,这些整数用数据类型表示i128(u128对于无符号整数):
let a: i128 = 170141183460469231731687303715884105727;
Run Code Online (Sandbox Code Playgroud)
Rust如何使这些i128值在64位系统上工作?例如,如何对这些进行算术运算?
据我所知,既然该值不能容纳在x86-64 CPU的一个寄存器中,那么编译器是否会以某种方式使用2个寄存器i128?还是他们改用某种大整数结构来表示它们?
我有一个bigint类型的表.该字段存储时间戳.我希望日期格式化这样的字段:
to_char( bigint_field,'DD/MM/YYYY HH24:MI:SS')
我收到以下错误:
ERROR: multiple decimal points État SQL :42601
当我尝试从表中获取列的总和时,我得到了错误,Arithmetic overflow error converting expression to data type int因为对于INT,结果数是大的.所以我尝试使用以下内容CAST到BIGINT
SELECT CAST(SUM(columnname) AS BIGINT) FROM tablename
Run Code Online (Sandbox Code Playgroud)
这给了我同样的错误.我有什么想法吗?
我在我的C++代码的内部循环中使用了128位整数计数器.(不相关背景:实际应用是评估规则网格上的有限差分方程,其中涉及重复递增大整数,甚至64位也不够精确,因为小的舍入累积足以影响答案.)
我将整数表示为两个64位无符号长整数.我现在需要将这些值递增128位常数.这并不难,但你必须手动捕捉低字到高字的进位.
我有这样的工作代码:
inline void increment128(unsigned long &hiWord, unsigned long &loWord)
{
const unsigned long hiAdd=0x0000062DE49B5241;
const unsigned long loAdd=0x85DC198BCDD714BA;
loWord += loAdd;
if (loWord < loAdd) ++hiWord; // test_and_add_carry
hiWord += hiAdd;
}
Run Code Online (Sandbox Code Playgroud)
这是一个紧凑而简单的代码.有用.
不幸的是,这大约是我运行时的20%.这条杀手线就是低价测试.如果我删除它,我显然得到了错误的答案,但运行时开销从20%下降到4%!因此携带测试特别昂贵!
我的问题:C++是否公开了硬件进位标志,即使是作为GCC的扩展?如果实际编译的指令使用最后一个进位指令进行添加,似乎可以在没有上面的测试和添加进位线的情况下完成添加.有没有办法重写test-and-add-carry行以使编译器使用内部操作码?
我想要一个128位整数,因为我想存储两个64位数的乘法结果.在gcc 4.4及以上版本中有没有这样的东西?
有没有办法在 JavaScript 中获取BigInt的对数?
对于普通数字,您可以使用以下代码:
const largeNumber = 1000;
const result = Math.log(largeNumber);
Run Code Online (Sandbox Code Playgroud)
但是,我需要使用阶乘数字,可能高于 170!,因此常规数字类型不起作用。Math.log不适用于 BigInt。那么如何得到对数呢?
const largeNumber = BigInt(1000);
const result = ???
Run Code Online (Sandbox Code Playgroud) 如何更改ActiveRecord ID的(默认)类型?int不够长,我宁愿长.令我感到惊讶的是,没有:迁移很久 - 是否只使用一些小数?
在我的一个研究项目中,我正在编写C ++代码。但是,生成的程序集是项目的关键点之一。C ++不提供对标志操作指令的直接访问,特别是对C ++,ADC但只要编译器足够聪明地使用它,这就不成问题。考虑:
constexpr unsigned X = 0;
unsigned f1(unsigned a, unsigned b) {
b += a;
unsigned c = b < a;
return c + b + X;
}
Run Code Online (Sandbox Code Playgroud)
Variable c是一种变通方法,可让我掌握进位标志并将其添加到b和中X。看起来我很幸运,(g++ -O3,版本9.1)生成的代码是这样的:
f1(unsigned int, unsigned int):
add %edi,%esi
mov %esi,%eax
adc $0x0,%eax
retq
Run Code Online (Sandbox Code Playgroud)
对于X我测试过的所有值,代码均与上面相同(当然,立即$0x0更改的立即值除外)。但我发现了一个例外:何时X == -1(或0xFFFFFFFFu或~0u,...的拼写方式并不重要)生成的代码为:
f1(unsigned int, unsigned int):
xor %eax,%eax
add %edi,%esi
setb %al
lea -0x1(%rsi,%rax,1),%eax
retq …Run Code Online (Sandbox Code Playgroud) 根据微软文档,[BigInt]数据类型似乎没有定义的最大值,理论上可以容纳无限大的数字,但我发现在第 28 位之后,一些奇怪的事情开始发生:
PS C:\Users\Neko> [BigInt]9999999999999999999999999999
9999999999999999999999999999
PS C:\Users\Neko> [BigInt]99999999999999999999999999999
99999999999999991433150857216
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在第一个命令1 上,BigInt按预期工作,但是还有一个数字,它转换99999999999999999999999999999为的地方似乎发生了一些衰减,99999999999999991433150857216但是,提示不会引发任何错误,您可以继续添加更多数字,直到第 310 个数字
PS C:\Users\Neko> [BigInt]99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336
PS C:\Users\Neko\> [BigInt]999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
Run Code Online (Sandbox Code Playgroud)
这将抛出错误
At line:1 char:318
+ ... 999999999999999999999999999999999999999999999999999999999999999999999
+ ~
The numeric constant 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
Run Code Online (Sandbox Code Playgroud)
我认为这是一个控制台问题而不是一个BigInt问题,因为错误没有提到[BigInt]数据类型,不像其他数据类型的数字太大
PS C:\Users\Neko> [UInt64]18446744073709551615
18446744073709551615
PS C:\Users\Neko> [UInt64]18446744073709551616
Cannot convert value "18446744073709551616" to …Run Code Online (Sandbox Code Playgroud) bigint ×10
gcc ×3
assembly ×2
c# ×2
c++ ×2
sql ×2
sql-server ×2
x86-64 ×2
.net ×1
.net-core ×1
128-bit ×1
activerecord ×1
biginteger ×1
c ×1
carryflag ×1
casting ×1
date ×1
int ×1
int128 ×1
javascript ×1
llvm-codegen ×1
logarithm ×1
long-integer ×1
math ×1
postgresql ×1
powershell ×1
rust ×1
timestamp ×1
x86 ×1