标签: 128-bit

Visual C++中的128位内部分割

我想知道在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内在函数.

integer-division intrinsics visual-c++ 128-bit

10
推荐指数
4
解决办法
5352
查看次数

在64位架构上不能使用Python中的128位浮点数

我通过我的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)

python numpy 128-bit

10
推荐指数
1
解决办法
6627
查看次数

有没有办法在gcc <4.4上做128位整数

gcc4.4似乎是在他们添加的时候int128_t我需要使用位移,而且我已经用完了一些位字段.

编辑:可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗?我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的工作位移.

c gcc bit-shift 128-bit

8
推荐指数
2
解决办法
5000
查看次数

__uint128_t on mingw gcc

我正在尝试在mingw gcc下编译ac程序.这个程序使用__uint128_t整数.当我尝试在同一个64位机器上使用标准的ubuntu gcc编译它时,它完全有效.但是,当我尝试在mingw下为windows编译它时,它甚至根本不识别__uint128_t关键字.这是什么意思?mingw下没有128位整数?如果没有,是否有任何编程语言的Windows具有本机(和FAST)128位整数?

c gcc mingw int128 128-bit

8
推荐指数
2
解决办法
3331
查看次数

使用汇编语言进行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]几乎是随机的.

performance x86 assembly 128-bit

8
推荐指数
1
解决办法
2866
查看次数

将二进制转换为十进制的最快方法?

我有四个无符号的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)

c bignum bigint 128-bit

7
推荐指数
1
解决办法
8093
查看次数

Windows上有c的128位整数?

Windows上是否有任何c编译器本身可以使用128位整数?例如,您可以在linux上使用gcc,使用__uint128_t ...在Windows上有任何其他机会吗?(如果128位计算机也能在32位计算机上运行,​​那就太好了!:D)

马特奥

c windows gcc integer 128-bit

7
推荐指数
1
解决办法
3681
查看次数

这个128位整数乘法如何在汇编(x86-64)中工作?

我正在阅读计算机系统:程序员的观点,家庭作业是描述这种算法是如何工作的.

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

c assembly x86-64 128-bit

7
推荐指数
2
解决办法
2007
查看次数

C中x64的128位算术运算

在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位整数运算.)

c 64-bit integer biginteger 128-bit

4
推荐指数
1
解决办法
3872
查看次数

SQL Server 2012中的128位Int?

我正在寻找在SQL Server中实现128位无符号整数的最佳方法.主要要求是它必须支持所有128位的按位运算.(这在理论上甚至可以在64位机器上使用吗?我离题了.)

我已经阅读了一些通过CLR程序集使用C#和用户定义类型的实现,但我无法确定它是否支持按位运算.

有没有人成功完成我需要做的事情?任何投入将不胜感激.谢谢!!

c# sql-server int bit-manipulation 128-bit

4
推荐指数
1
解决办法
2185
查看次数

无法使用 nasm 编译具有 xmmword 操作数大小的汇编代码

我试图使用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 进行编译?

assembly sse nasm 128-bit

3
推荐指数
1
解决办法
735
查看次数

如何将两个 64 位整数连接成一个 128 位整数?

我有 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.

还有其他方法可以做到吗?

c concatenation 128-bit

2
推荐指数
1
解决办法
1995
查看次数

C 128位双精度型

我有以下代码...

            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)

c binary double types 128-bit

2
推荐指数
1
解决办法
1万
查看次数