我想知道在Visual C++中是否真的没有128位除法内部函数?
有一个名为_umul128()的64x64 = 128位乘法内部函数,它很好地匹配MUL x64汇编程序指令.
当然,我假设也会有一个128/64 = 64位内部分区(对DIV指令进行建模),但令我惊讶的是,Visual C++和英特尔C++似乎都没有它,至少它没有在intrin.h中列出.
有人可以证实吗?我尝试grep'ing在编译器可执行文件中的函数名称,但首先找不到_umul128,所以我想我看错了.
更新:至少我现在在Visual C++ 2010的c1.dll中找到了模式"umul128"(没有前导下划线).所有其他内在函数都列在它周围,但不幸的是没有"udiv128"之类的东西:(所以它似乎他们真的"忘记"实施它.
澄清一下:我不只是在寻找128位数据类型,而是在C++中将128位标量int除以64位int的方法.无论是一个内在的功能或本地 128位整数的支持会解决我的问题.
编辑:答案是否定的,Visual Studio 2010或2012中没有_udiv128内在函数.
我通过我的python终端(在Enthought Canopy IDE中)检查了指针的大小
import ctypes
print (ctypes.sizeof(ctypes.c_voidp) * 8)
Run Code Online (Sandbox Code Playgroud)
我有一个64位的架构,并且工作numpy.float64得很好.但我不能用np.float128?
np.array([1,1,1],dtype=np.float128)
Run Code Online (Sandbox Code Playgroud)
要么
np.float128(1)
Run Code Online (Sandbox Code Playgroud)
结果是:
AttributeError: 'module' object has no attribute 'float128'
Run Code Online (Sandbox Code Playgroud)
我正在运行以下版本:
sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)
Run Code Online (Sandbox Code Playgroud) gcc4.4似乎是在他们添加的时候int128_t我需要使用位移,而且我已经用完了一些位字段.
编辑:可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗?我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的工作位移.
我正在尝试在mingw gcc下编译ac程序.这个程序使用__uint128_t整数.当我尝试在同一个64位机器上使用标准的ubuntu gcc编译它时,它完全有效.但是,当我尝试在mingw下为windows编译它时,它甚至根本不识别__uint128_t关键字.这是什么意思?mingw下没有128位整数?如果没有,是否有任何编程语言的Windows具有本机(和FAST)128位整数?
在现代英特尔CPU(核心i7,沙桥)上进行128位移位的最有效方法是什么?
类似的代码在我最内层的循环中:
u128 a[N];
void xor() {
for (int i = 0; i < N; ++i) {
a[i] = a[i] ^ (a[i] >> 1) ^ (a[i] >> 2);
}
}
Run Code Online (Sandbox Code Playgroud)
数据a[N]几乎是随机的.
我有四个无符号的32位整数,表示无符号的128位整数,以小端顺序表示:
typedef struct {
unsigned int part[4];
} bigint_t;
Run Code Online (Sandbox Code Playgroud)
我想将此数字转换为十进制字符串表示形式并将其输出到文件中.
现在,我正在使用一个bigint_divmod10函数将数字除以10,跟踪余数.我重复调用此函数,将余数作为数字输出,直到数字为零.这很慢.这是最快的方法吗?如果是这样,有没有一种聪明的方法来实现我没有看到的这个功能?我试过看GMP get_str.c,但我发现它非常难以理解.
编辑:这是我能够为divmod10函数提供的最快的代码:
static unsigned uint128_divmod10(uint128 *value)
{
unsigned int a = value->word[3];
unsigned int b = value->word[2];
unsigned int c = value->word[1];
unsigned int d = value->word[0];
unsigned int diva = a / 5;
unsigned int divb = b / 5;
unsigned int divc = c / 5;
unsigned int divd = d / 5;
value->word[3] = diva;
value->word[2] = divb;
value->word[1] = divc;
value->word[0] = …Run Code Online (Sandbox Code Playgroud) Windows上是否有任何c编译器本身可以使用128位整数?例如,您可以在linux上使用gcc,使用__uint128_t ...在Windows上有任何其他机会吗?(如果128位计算机也能在32位计算机上运行,那就太好了!:D)
马特奥
我正在阅读计算机系统:程序员的观点,家庭作业是描述这种算法是如何工作的.
C功能:
void store_prod(__int128 *dest, int64_t x, int64_t y) {
*dest = x * (__int128)y;
}
Run Code Online (Sandbox Code Playgroud)
部件:
movq %rdx, %rax
cqto
movq %rsi, %rcx
sarq $63, %rcx
imulq %rax, %rcx
imulq %rsi, %rdx
addq %rdx, %rcx
mulq %rsi
addq %rcx, %rdx
movq %rax, (%rdi)
movq %rdx, 8(%rdi)
ret
Run Code Online (Sandbox Code Playgroud)
我不知道它为什么表现: xh * yl + yh * xl = value which we add after unsigned multiplication
在x86上实现bignums时,显然数字大小的最有效选择是32位.但是,您需要算术最多两倍的数字大小(即32 + 32 = 33,32*32 = 64,64/32 = 32).幸运的是,x86不仅提供了这一功能,而且还可以从便携式C(uint64_t)访问它.
类似地,在x64上,希望使用64位数字.这将需要128位算术(即64 + 64 = 65,64*64 = 128,128/64 = 64).幸运的是,x64提供了这个功能.不幸的是,它无法通过便携式C接入,但很明显可以进入组装.
所以我的问题是它是否可从非便携式C访问.X64上的任何C编译器是否提供对此的访问,如果是,那么语法是什么?
(注意,我不是在谈论128位向量,它们被严格地视为32或64位字的集合,它们之间没有进位传播,但是关于实际的128位整数运算.)
我正在寻找在SQL Server中实现128位无符号整数的最佳方法.主要要求是它必须支持所有128位的按位运算.(这在理论上甚至可以在64位机器上使用吗?我离题了.)
我已经阅读了一些通过CLR程序集使用C#和用户定义类型的实现,但我无法确定它是否支持按位运算.
有没有人成功完成我需要做的事情?任何投入将不胜感激.谢谢!!
我试图使用nasm( nasm -o file input.asm) 编译汇编代码,并在以下代码片段的第 2 行抛出错误:
mov rsi, 0x400200
movdqu xmm0,xmmword [rsi]
nop
Run Code Online (Sandbox Code Playgroud)
我不确定是否可以使用 128 位寄存器的指令进行编译nasm,但是在涉及 128 位寄存器的情况下,是否有其他方法可以使用 nasm 进行编译?
我有 2 个 64 位整数,我想将其连接成一个 128 位整数。
uint64_t len_A;
uint64_t len_C;
len_AC= (len_A << 64) | len_C;
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会不支持uint128_t.
还有其他方法可以做到吗?
我有以下代码...
ran_int = rand(); //check READ ME Citation B
if (input == 32){
//rand() with 2^31 as lower limit and 2^32 as its upper
long long int upper_limit = 4294967295;
long long int lower_limit = 2147483649
ran_32_64 = (rand() * 2) % (upper_limit - lower_limit);
ran_32_64 += lower_limit;
}
else if(input == 64){
//rand() x 4 with 2^63 as lower limit and 2^64 as its upper
unsigned long long int upper_limit = powl(2, 64);
long long int lower_limit = powl(2, …Run Code Online (Sandbox Code Playgroud)