Questions tagged «floating-point»

用固定的有效数字位数和某个基数的指数表示数字的方法。它们的形式如下 (significantdigits)baseexponent。通常,数字以base = 2(二进制)表示。

4
确定性模型的运行会产生小的,不可预测的结果
我有一个用C编写的相当大的模型(约5000行)。它是一个串行程序,在任何地方都没有随机数的产生。它将FFTW库用于使用FFT的函数-我不知道FFTW实现的详细信息,但是我假设其中的函数也是确定性的(如果我出错,请更正我)。 我无法理解的问题是,在同一台计算机(相同的编译器,相同的库)上运行相同的结果在结果上存在很小的差异。 我使用双精度变量,并将结果输出到变量中value,例如,我发出: fprintf(outFID, "%.15e\n", value);或 fwrite(&value, 1, sizeof(double), outFID); 而且我会不断得到诸如以下的差异: 2.07843469652206 4 e-16与2.07843469652206 3 e-16 我花了很多时间试图找出原因。最初我以为我的一个存储芯片已经坏了,所以我下令更换了它们,无济于事。随后,我还尝试在同事的Linux机器上运行我的代码,并且得到了相同性质的差异。 是什么原因造成的?现在这是一个小问题,但我想知道这是否是“冰山一角”(一个严重的问题)。 我以为我会在这里发布而不是StackOverflow,以防有人使用数值模型。如果有人可以阐明这一点,我将非常有义务。 评论后续: Christian Clason和Vikram:首先,感谢您对我的问题的关注。您链接的文章建议:1.舍入错误限制了准确性,并且2.不同的代码(例如引入看似无害的打印语句)可能会影响机器的结果。我要澄清的是,我没有比较效果fwrite和fprintf功能。我正在使用一个或另一个。特别是,两次运行都使用相同的可执行文件。我只是在说明是否使用fprintfOR 发生问题fwrite。 因此,代码路径(和可执行文件)相同,硬件也相同。在所有这些外部因素保持不变的情况下,随机性从何而来呢?我怀疑由于错误的内存无法正确保留位而发生了位翻转,这就是为什么我更换了内存芯片的原因,但是我证实这并不是这里的问题,我证实并指出。我的程序在一次运行中输出了数千个这种双精度数字,并且总是有随机的少数具有随机的位翻转。 跟帖基督教克拉森的第一个评论:为什么是机器精度内一样的0?双精度数的最小正数是2.22e-308,那不等于0吗?我的程序输出10 ^ -16范围(从1e-15到8e-17)的数千个值,并且我们一直在研究项目中看到有意义的变化,所以我希望我们不要一直在研究荒谬的东西。数字。2 ⋅ 10− 162⋅10-162\cdot 10^{-16} 后续活动2: 这是模型输出的时间序列的图,有助于注释中的分支讨论。

1
操作顺序,数值算法
我读过 (1)条件恶劣的操作应在条件良好的操作之前进行。 举例来说,由于减法不适用于乘法,而减法不适用于条件,因此应将计算为。(x - y )zxz−yzxz−yzxz-yz(x−y)z(x−y)z(x-y)z 但是,对这两种算法的一阶误差分析表明,它们的相差仅三倍(*),而且我不明白为什么有人可以将其概括为语句(1),也无法直观地理解操作顺序。您认为陈述(1)是被接受的规则,您对此有其他解释吗? *:更具体地说,第一个版本的相对误差由 eps+3|x|+|y||x|−|y|epseps+3|x|+|y||x|−|y|eps\text{eps}+3\frac{|x|+|y|}{|x|-|y|}\text{eps}而第二版本的相对误差由 3eps+|x|+|y||x|−|y|eps3eps+|x|+|y||x|−|y|eps3\text{eps}+\frac{|x|+|y|}{|x|-|y|}\text{eps} 其中是机器精度。epseps\text{eps} 该分析基于以下假设:第个中间结果乘以(由于舍入误差),其中是由界定的iid随机变量。“一阶”表示忽略诸如的高阶术语。(1 + ε 我)ε 我 EPS ε 我ε Ĵ Xiii(1+εi)(1+εi)(1+\varepsilon_i)εiεi\varepsilon_iepseps\text{eps}ϵiϵjxϵiϵjx\epsilon_i\epsilon_jx

4
定点和任意精度计算的相关性
我看到很少有非浮点计算库/程序包。鉴于浮点表示形式的各种不准确性,提出了一个问题,为什么至少在某些领域中,这种提高的准确性可能值得使用定点运算的复杂性。 使用定点特征值求解器是否有重大困难?他们将有多慢/快,不准确/准确? 相关:这个和这个

3
浮点数的相对比较
我有一个f(x, y)返回双浮点数的数值函数,该数字实现了一些公式,并且我想检查参数组合的所有解析形式对解析表达式的正确性x以及y我是否感兴趣。比较计算所得的和分析浮点数? 假设两个数字是a和b。到目前为止,我一直在确保绝对(abs(a-b) < eps)和相对(abs(a-b)/max(abs(a), abs(b)) < eps)误差均小于eps。这样,即使数字在1e-20左右,它也会捕获数字不准确的地方。 但是,今天我发现了一个问题,其数值a和解析值为b: In [47]: a Out[47]: 5.9781943146790832e-322 In [48]: b Out[48]: 6.0276008792632078e-322 In [50]: abs(a-b) Out[50]: 4.9406564584124654e-324 In [52]: abs(a-b) / max(a, b) Out[52]: 0.0081967213114754103 因此,绝对误差[50](显然)很小,但是相对误差[52]很大。所以我认为我的程序中有错误。通过调试,我意识到这些数字是不正常的。因此,我编写了以下例程来进行适当的相对比较: real(dp) elemental function rel_error(a, b) result(r) real(dp), intent(in) :: a, b real(dp) :: m, d d = …

2
如何在Fortran中设置双精度值
最近,我在FORTRAN95中遇到了一个奇怪的问题。我将变量X和Y初始化如下: X=1.0 Y=0.1 后来我将它们加在一起并打印结果: 1.10000000149012 在检查了变量之后,似乎没有以完全精度的双精度表示0.1。有什么办法可以避免这种情况?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.