使用任意精度算术(例如512位整数)时,有没有办法让GCC在不使用内联汇编的情况下使用ADC和类似指令?
乍一看GMP的源代码显示,它们只是为每个支持的平台提供了汇编实现.
这是我编写的测试代码,它从命令行添加两个128位数字并打印结果.(受mini-gmp的add_n启发):
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
uint32_t a[4];
uint32_t b[4];
uint32_t c[4];
uint32_t carry = 0;
for (int i = 0; i < 4; ++i)
{
a[i] = strtoul (argv[i+1], NULL, 16);
b[i] = strtoul (argv[i+5], NULL, 16);
}
for (int i = 0; i < 4; ++i)
{
uint32_t aa = a[i];
uint32_t bb = b[i];
uint32_t r = aa + carry;
carry = (r < carry);
r += …Run Code Online (Sandbox Code Playgroud) c optimization gcc compiler-optimization arbitrary-precision
在Perl中是否有任何标准方法可以使用任意长度的整数?我正在研究为测试生成x64程序集的代码,我厌倦了一次操作32位.
我正在使用Perl 5.10.0,因为它的价值.
希望只是一个简单的问题.DECIMAL我的数据库中有一列.该值是一个非常小的小数部分 - 对所有行的此值求和将等于1.
现在我想在我的php应用程序中使用此值,显示它,对其执行计算并将其保存回数据库.
由于php只有integer和float类型,在php中使用该值的最佳方法是什么,以免在计算或显示中失去任何精度?
float- 我知道php浮点数是一个很好的数字(取决于操作系统)谢谢
我目前正在对大量数字(最多 10M 位)进行素性测试。
现在,我正在使用带有 GMP 库的 ac 程序。我使用 OpenMP 进行了一些并行化,并获得了不错的加速(4 核时为 3.5~)。问题是我没有足够的 CPU 核心来运行我的整个数据集。
我有一个 NVidia GPU,并且我试图找到 GMP 的替代方案,但适用于 GPU。它可以是 CUDA 或 OpenCL。
是否有可以在我的 GPU 上运行的任意精度库?如果有一种简单或更优雅的方法,我也愿意使用另一种编程语言。
我觉得大多数数值分析软件都使用相同的浮点数和双精度数.
如果我是对的,我很想知道原因,因为在我看来,有些计算可以从任意精度算术的使用中受益,特别是当它与有理数表示的结合使用时,在GNU多精度库上完成.
如果我错了,例子会很好.
是否有一个纯粹的python实现fractions.Fraction支持longs作为分子和分母?不幸的是,取幂似乎被编码为返回浮点数(ack !!!),这应该至少支持使用decimal.Decimal.
如果没有,我想我可以制作一个库的副本,并尝试float()用适当的东西替换出现的东西,Decimal但我宁愿以前经过别人测试的东西.
这是一个代码示例:
base = Fraction.from_decimal(Decimal(1).exp())
a = Fraction(69885L, 53L)
x = Fraction(9L, 10L)
print base**(-a*x), type(base**(-a*x))
Run Code Online (Sandbox Code Playgroud)
结果0.0 <type 'float'>是答案应该是一个非常小的小数.
更新:我现在有以下解决方法(假设,对于**b,两者都是分数;当然,当exp_是浮点数或者本身是十进制时,我还需要另一个函数):
def fracpow(base, exp_):
base = Decimal(base.numerator)/Decimal(base.denominator)
exp_ = Decimal(exp_.numerator)/Decimal(exp_.denominator)
return base**exp_
Run Code Online (Sandbox Code Playgroud)
给出了答案4.08569925773896097019795484811E-516.
如果没有额外的功能有更好的方法,我仍然会感兴趣(我猜测如果我在Fraction课堂上工作得足够多,我会发现其他花车正在进入我的结果).
作为个人项目,我正在为我的宠物项目实施任意精度数字类型.
我已经知道所有流行,经过测试和强大的库都可以做到这一点.我想将解决方案作为自我改进教育项目.
我正在研究该领域并试图弄清楚是否有某种方法可以粗略预测在我实际进行计算之前操作是否会导致溢出.我也不是那么担心误报.
我希望能够使用适合计算的最小空间.如果计算将保持在其原生范围内,我会将其保留在那里.
例如:Multiplying two 64 bit Integers if each are large enough will cause an overflow.我想检测到这一点,并且仅当结果可能超过64位分辨率时才将数字上转换为我的数字类型.我将在此实验中使用带符号的数字.
检测溢出/下溢的最有效,最有效的方法是什么?
SHLD/SHRD指令是用于实现多精度移位的汇编指令.
请考虑以下问题:
uint64_t array[4] = {/*something*/};
left_shift(array, 172);
right_shift(array, 172);
Run Code Online (Sandbox Code Playgroud)
什么是实行最有效的方法left_shift和right_shift,经营4个64位无符号整数数组上的转变,就好像它是一个巨大的256位无符号整数两种功能?
最有效的方法是使用SHLD/SHRD指令,还是有更好的(如SIMD版本)现代架构指令?
这里的第一个问题,以及普通LISP和Haskell的新手,请善待.我在Common LISP中有一个函数 - 下面的代码 - 用于判断三角形的面积是否为整数?(整数?).
(defun area-int-p (a b c)
(let* ((s (/ (+ a b c) 2))
(area (sqrt (* s (- s a) (- s b) (- s c)))))
(if (equal (ceiling area) (floor area))
t
nil)))
Run Code Online (Sandbox Code Playgroud)
这应该使用Heron的公式来计算三角形的面积,给定三边的大小,并确定它是否是比较天花板和地板的整数.我们被告知等边三角形的面积永远不是整数.因此,为了测试函数是否正常工作,我使用参数运行它333.这是我得到的回报:
CL-USER> (area-int-p 333 333 333)
NIL
Run Code Online (Sandbox Code Playgroud)
完善!有用.为了进一步测试它,我用参数运行它3333.这是我得到的回报:
CL-USER> (area-int-p 3333 3333 3333)
T
Run Code Online (Sandbox Code Playgroud)
有些事情是错的,这不应该发生!所以,我尝试以下,希望等效的Haskell函数看看会发生什么:
areaIntP :: (Integral a) => a -> a -> a -> Bool
areaIntP a b c =
let aa …Run Code Online (Sandbox Code Playgroud) 问题非常简单直接,但我找不到文档的答案.如果我有
mpfr_t a, b;
Run Code Online (Sandbox Code Playgroud)
我能做点什么吗
mpfr_add(a, a, b, rnd);
Run Code Online (Sandbox Code Playgroud)
这将计算的总和a,并b与存储的结果a.我不知道这是否会导致别名问题,可能导致结果无效,或者这是否正常.