问题标签 [extended-precision]

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.

0 投票
2 回答
12579 浏览

c - Is there a 256-bit integer type?

OS: Linux (Debian 10)

CC: GCC 8.3

CPU: i7-5775C

There is a unsigned __int128/__int128 in GCC, but is there any way to have a uint256_t/int256_t in GCC?

I have read of a __m256i which seems to be from Intel. Is there any header that I can include to get it?

Is it as usable as a hypothetic unsigned __int256? I mean if you can assign from/to it, compare them, bitwise operations, etc.

What is its signed equivalent (if any)?


EDIT 1:

I achieved this:

and compiled. If I can do some operations with it, I'll update it here.


EDIT 2:

Issues found:

ouput:

0 投票
2 回答
798 浏览

c - 得到无符号长长加法进位

我想获得在 c 中添加两个无符号 64 位整数的进位位。如果需要,我可以使用 x86-64 asm。代码:

0 投票
0 回答
488 浏览

c++ - 为英特尔 AVX[SIMD] 优化 128x128 到 256 位乘法

我正在尝试通过英特尔 AVX 在两个 64 无符号整数上实现 128 无符号整数的乘法。问题是非矢量化版本比手动矢量化版本工作得更快。

这是我的测试基准。在我的笔记本电脑上,我得到了下一个结果:

  • AVX-5200
  • 非AVX - 1600

如何优化我的 SIMD - AVX 代码?

0 投票
1 回答
202 浏览

clojure - 在 Clojure 中使用浮点值的理念是什么?

目前我正在使用Clojure-on-top-of-the-JVM。

Java 语言公开了 JVM的浮点功能,它说我们得到(确切地说IEEE-754 32 位单精度(Java “float”)和64 位双精度(Java “double”)表示和JVM 可能在计算期间使用扩展精度”实现(“扩展双精度”为 80 位,在某些编程语言中也称为“长双精度”)。目前还没有关于半精度或四倍精度的消息。

对于Clojure-on-top-of-ECMAScript(即 ClojureScript),有一个底层数字类型,恰好是 IEEE-754 64 位双精度浮点数。

似乎在 Clojure-on-the-JVM 的情况下,在所有需要浮点的情况下都鼓励使用“double”。甚至没有办法测试给定的事物是否是单精度浮点,因为float?(也许令人惊讶)测试该事物是否是任何类型的浮点值。不一致的是,有一个“转换为浮动”的函数,称为float.

因此,鼓励程序员不要考虑精度,让 Clojure 为他/她选择——而 Clojure 始终选择 IEEE binary64。这是事情的要旨吗?

0 投票
0 回答
245 浏览

c - 反汇编简单的 C 函数。(64 位机器中的 128 位乘法)

我正在解决一本名为“计算机系统”的书中的问题。这是我正在努力解决的问题。


问题:以下代码计算两个 64 位有符号值 x 和 y 的 128 位乘积,并将结果存储在内存中:

Gcc 生成以下实现计算的汇编代码:

此代码对在 64 位机器上实现 128 位算术所需的多精度算术使用三次乘法。描述用于计算产品的算法,并注释汇编代码以显示它如何实现您的算法。


我试图注释每个汇编代码。但是我完全迷失了第四条指令。我了解每个汇编代码是如何工作的,但是在将它们组合在一起的过程中我迷失了。

对不起我的英语不好,我希望你明白我在说什么。

0 投票
1 回答
326 浏览

assembly - 有效地跨寄存器移位

如何在 x64-Assembly 中有效地用另一个寄存器的最低有效位填充寄存器的最高有效位。预期用途是将 128 位值除以 2(本质上是跨寄存器移位)。

0 投票
0 回答
215 浏览

assembly - 在汇编中找到大量的阶乘,当 n>=15 时不起作用

我正在使用 MASM 和 dosbox 来执行此操作,基本上将 C 版本转换为程序集。

我认为如果我遵循这条路线,寄存器溢出不会有问题。从 1 开始效果很好!到 14!,但在计算 15! 时卡住了。

在此处输入图像描述

这是代码

我认为C版本的算法可以避免寄存器溢出的常见问题。所以我不知道在哪里改进我的代码。我有两个猜测:

  1. 还是有东西溢出来。但我找不到它。
  2. dosbox 有一些未知的限制

代码很长,如果有人能给我一些建议,我将不胜感激。

0 投票
0 回答
333 浏览

assembly - 如何在两个不同的寄存器之间移位?

我有两个寄存器,R1 和 R2。我需要他们之间的班次操作。此操作是否有任何说明,或者我应该遵循不同的路径?实际上,我可以使用 AND 指令获得 R1 的低位,但是,我也可以使用 ASR 指令移动 R2,但我不能将该位附加到 R2 的最高有效部分。

在寄存器之间移动

0 投票
7 回答
926 浏览

c - 高效计算三个无符号整数的平均值(无溢出)

有一个现有的问题“3 个长整数的平均值”,它特别关注三个有符号整数的平均值的有效计算。

然而,无符号整数的使用允许额外的优化不适用于上一个问题所涵盖的场景。这个问题是关于三个无符号整数平均值的有效计算,其中平均值向零舍入,即在数学术语中我想计算 ⌊ (a + b + c) / 3 ⌋。

计算该平均值的一种直接方法是

首先,现代优化编译器会将除法转换为具有倒数加移位的乘法,并将模运算转换为反乘和减法,其中反乘可以使用许多架构上可用的scale_add习惯用法,例如leax86_64,addlsl #nARM 上,iscadd在 NVIDIA GPU 上。

在尝试以适用于许多常见平台的通用方式优化上述内容时,我观察到整数运算的成本通常处于逻辑关系≤(add | sub)≤ shiftscale_addmul。这里的成本是指所有延迟、吞吐量限制和功耗。当处理的整数类型比本机寄存器宽度宽时,任何此类差异都会变得更加明显,例如在uint64_t32 位处理器上处理数据时。

因此,我的优化策略是尽量减少指令数,并在可能的情况下用“廉价”操作替换“昂贵”操作,同时不增加寄存器压力并为广泛的无序处理器保留可利用的并行性。

第一个观察结果是,我们可以通过首先应用产生一个和值和一个进位值的 CSA(进位保存加法器)将三个操作数的总和减少为两个操作数的总和,其中进位值的权重是总和的两倍价值。在大多数处理器上,基于软件的 CSA 的成本是 5 个逻辑s。一些处理器,比如 NVIDIA GPU,有一条LOP3指令可以一举计算三个操作数的任意逻辑表达式,在这种情况下,CSA 会压缩为两个LOP3s(注意:我还没有说服 CUDA 编译器发出这两个LOP3s;它目前生产四个LOP3s!)。

第二个观察是,因为我们正在计算除以 3 的模数,所以我们不需要反向乘法来计算它。我们可以改为使用dividend % 3= ,((dividend / 3) + dividend) & 3模数减少为加法加逻辑因为我们已经有了除法结果。这是通用算法的一个实例:股息 % (2 n -1) = ((股息 / (2 n -1) + 股息) & (2 n -1)。

最后,对于校正项中的除以 3,(a % 3 + b % 3 + c % 3) / 3我们不需要通用除以 3 的代码。由于被除数非常小,在 [0, 6] 中,我们可以简化x / 3(3 * x) / 8只需要scale_add加上shift的代码。

下面的代码显示了我当前正在进行的工作。使用 Compiler Explorer 检查为各种平台生成的代码显示了我期望的紧凑代码(使用 编译时-O3)。

然而,在使用 Intel 13.x 编译器对我的 Ivy Bridge x86_64 机器上的代码进行计时时,一个缺陷变得明显:uint64_t与简单版本相比,我的代码提高了延迟(数据从 18 个周期到 15 个周期),吞吐量变差了(从数据每 6.8 个周期一个结果到每 8.5 个周期一个结果uint64_t)。更仔细地查看汇编代码很明显为什么会这样:我基本上设法将代码从大致三向并行度降低到大致双向并行度。

是否有一种普遍适用的优化技术,对常见的处理器特别是所有类型的 x86 和 ARM 以及 GPU 都有益,它可以保留更多的并行性?或者,是否有一种优化技术可以进一步减少总体操作数以弥补并行度的降低?校正项的计算(tail在下面的代码中)似乎是一个很好的目标。简化(carry_mod_3 + sum_mod_3) / 2看起来很诱人,但为九种可能的组合之一提供了不正确的结果。

0 投票
0 回答
54 浏览

assembly - 如何在 8086 汇编中将两个 16 位 dW 合并到一个 DD 数中

使用以下代码,我计算斐波那契数列的前 30 个元素。请注意,arr 的每两个元素代表斐波那契数列的一个元素,而第 26 个元素之后的斐波那契数将需要超过 2 个字节来表示。

我的大学作业要求将第 30 个元素存储在名为the30的变量中,其中DD但我不知道当所有寄存器最多为 16 位时这怎么可能。

有没有办法做到这一点?