下列文件和两双算法的源代码有一段时间了,我仍然无法找出究竟是如何一个dd_real(定义为struct dd_real { double x[2];...}
数量)分成两个双打.假如我用字符串初始化它,dd_real pi = "3.14159265358979323846264338327950";
会是什么pi.x[0]
和pi.xi[1]
?我需要理解它,然后编写一个希望小的Python函数来完成它.
我不只是想调用QD库的原因是我更喜欢在Python中重新实现正确的分割,以便我发送我的35位精度常量(以字符串形式给出),就像double2
CUDA代码一样.被GQD库视为双重实物 - 似乎是唯一一个处理CUDA中扩展精度计算的库.不幸的是,在Python方面也排除了mpmath.
我已经尝试过1e-324
在R中基本上是零.所以,当我想做这样的计算时我该怎么办:
1e-2000/1e-2000
#[1] NaN
#But the real value should be 1
Run Code Online (Sandbox Code Playgroud)
所以,任何帮助表示赞赏.
在2013年,有一个问题是将大工作代码从双精度转换为四倍精度:" 将工作代码从双精度转换为四倍精度:如何从输入文件读取FORTRAN中的四倍精度数字 ",以及共识是使用可调参数"WP"来声明变量,该参数指定"工作精度",而不是使用D + 01声明的变量的程序的单独版本,以及使用Q + 01的另一个版本.通过这种方式,我们可以通过在顶部定义WP = real128或WP = real64来轻松来回切换,其余的不需要更改.
但是我们怎么做呢?
我通过编写一个简单的代码TEST.F90在该问题的答案中尝试了这个建议:
PROGRAM TEST
use ISO_FORTRAN_ENV
WP= real128
IMPLICIT NONE
real (WP) :: X
X= 5.4857990945E-4_WP
END PROGRAM TEST
Run Code Online (Sandbox Code Playgroud)
编译:
~/gcc-4.6/bin/gfortran -o tst.x TEST.F90
Run Code Online (Sandbox Code Playgroud)
但它给出了:
IMPLICIT NONE
1
Error: Unexpected IMPLICIT NONE statement at (1)
QLEVEL16.F90:5.12:
real (WP) :: MEL
1
Error: Parameter 'wp' at (1) has not been declared or is a variable, which does not reduce to a constant expression
QLEVEL16.F90:6.29:
MEL= 5.4857990945E-4_WP
1
Error: …
Run Code Online (Sandbox Code Playgroud) 在2ghz双核奔腾笔记本电脑上运行bigint的C实现,无需任何程序集,SSE等;期望质数创建的平均时间是多少?
大于512位的素数需要30秒正常吗?
2048、4096位等呢?
来自安全性堆栈交换问题56214
我最近生成了一些自定义Diffie Hellmann参数,这些参数基本上只是长质数(在下面的情况下为4096位)。
由于这一代花费了大约2个小时,所以它不可能是即时生成的。
这是典型的吗?-2小时生成一个4096位密钥...
这是我前一个问题的后续问题.
我正在尝试将Harmonic系列计算为非常大的项,但是当与log(n)+γ进行比较时,我没有得到预期的误差.
我怀疑主要问题是BigFloat
julia类型.
harmonic_bf = function(n::Int64)
x=BigFloat(0)
for i in n:-1:1
x += BigFloat(1/i)
end
x
end
Run Code Online (Sandbox Code Playgroud)
例如,众所周知,公式的下限:H_n-log(n)-γ是1/2 /(n + 1).然而,这适用于n = 10 ^ 7然后在n = 10 ^ 8时失败.
n=10^8
? = big"0.57721566490153286060651209008240243104215933593992"
lower_bound(n) = 1/2/(n+1)
>>> harmonic_bf(n)-log(n)-? > lower_bound(BigFloat(n))
false
Run Code Online (Sandbox Code Playgroud)
它让我疯狂,我似乎无法理解缺少的东西...... BigFloat
应该让算术精度问题解决,但似乎并非如此.
注意:我尝试使用未设置的精度和256位精度的BigFloat.
如何u128
将 a 转换为 s 数组u64
。当将 a 传递u128
给采用任意精度 int 的 API 时,该 API 需要 3 个参数
LLVMValueRef LLVMConstIntOfArbitraryPrecision (
LLVMTypeRef IntTy,
unsigned NumWords,
const uint64_t Words[]
)
Run Code Online (Sandbox Code Playgroud)
前两个参数已知(IntTy
=LLVMInt128Type
和NumWords
= 2)。第三个参数需要一个 s 数组uint64_t
。提供的u128需要转换为u64的数组。从rust 文档来看,它似乎u128
可以转换为字节数组,例如
let buff: [u8; 16] = u128_val.to_ne_bytes();
let Words: [u64; 2] = ?? // What to do here?
Run Code Online (Sandbox Code Playgroud)
如何buff
转换为数组Words
?另外,如何处理字节序。为简单起见,代码生成器和 API 将在具有相同字节序的机器上运行。
Python的任意精度小数都很可爱,但我似乎无法找到一种以格式良好的方式打印它们的方法.例如,如果我计算以下表达式:
>>> pow(2,70) -2
1180591620717411303422L
Run Code Online (Sandbox Code Playgroud)
它以2结尾,就像它应该的那样.但是,如果我尝试将其格式化为显示两个小数位,则会将其四舍五入为2 ^ 70,因为浮点数不是很精确.
>>> print "{0:.2f}".format(pow(2,70) -2)
1180591620717411303424.00
Run Code Online (Sandbox Code Playgroud)
有没有办法用我想要的格式打印而不会丢失精度?
(并且不使用任何非标准模块,如NumPy)
我开始自学C++直到我的课程在秋季开课.我想知道你是否能够帮我提出一个更好的方法来询问用户他们想要的数字pi数字,然后显示它.我的问题是使用pi = atan(1)*4并不精确到大约10位小数.是否有更好的内置数字,pi至少至少20个小数位?这是我到目前为止,谢谢!
#include <iostream>
#include <string>
#include <iomanip>
#include <ios>
#include <sstream>
using namespace std;
using std::setprecision;
using std::streamsize;
int main()
{
double pi = atan(1)*4;
int input = 0;
while(true)
{
cout << "Please enter how many digits of PI you would like to see (Max 20): ";
cin >> input;
if(input > 0 && input <= 20)
{
break;
}
else
{
cout << "That's not a valid number! Try again." << endl;
}
}
streamsize prec …
Run Code Online (Sandbox Code Playgroud) 在Mathematica中有一个选项可以看到这个问题来计算两个误差函数之间的差异.但是,我还没有在R中找到类似的东西.
我需要计算像Erf(1604.041) - Erf(3117.127)这样的东西并获得非零值......
作为Julia的新人,本月,即2018年9月,我刚刚习惯了最初不熟悉的"@"符号表示宏和"!" 具有可变输入的函数的符号.我是否正确地认为这些仅仅是人类阅读的风格符号,而且他们并没有真正向编译器提供任何信息?
我在以下代码的上下文中提到这一点,这些代码似乎与我所知道的Julia,函数或其他任何东西的样式不匹配.我特别询问下面的大"1234":
julia> big"1234" # big seems to be neither a macro or a function.
1234
julia> typeof(big"1234")
BigInt
julia> typeof(BigInt(1234))
BigInt
Run Code Online (Sandbox Code Playgroud)
我的问题是:什么是大"1234"?
编辑:我想我的答案基于https://discourse.julialang.org/t/bigfloat-promotion-rules-and-constants-in-functions/14573/4上的评论
"请注意,因为在解析时十进制文字被转换为浮点数,BigFloat(2.1)可能不会产生您期望的结果.您可能更喜欢通过解析或使用大字符串文字来初始化字符串中的常量.
julia> BigFloat(2.1)
2.100000000000000088817841970012523233890533447265625
julia> big"2.1"
2.099999999999999999999999999999999999999999999999999999999999999999999999999986"
Run Code Online (Sandbox Code Playgroud)
因此,基于上述评论,大"1234"中的大字是"大字符串字面".
编辑2:以上是答案的开始,但下面接受的答案要完整得多.
如果我理解正确的话,下限除法的返回值始终是整数,即使被除数和/或除数不是整数,那么为什么它不总是返回整数。
在我的例子中这是有害的,因为从大浮点数转换为 int 而不是将返回值作为任意精度整数显然会损失精度。
我看不到任何执行浮点除法以返回整数的函数。显然我可以创建一个函数来执行此操作,例如将两个值乘以相同的数量,以便它们都是整数,但它会比 C 实现慢很多。
这是一个例子:5.2 // 2
不是2.0
。2
python floating-point precision arbitrary-precision floor-division