【问题标题】:Octave precision for floats: Is it 128 bit under the hood?浮点数的八度精度:引擎盖下是 128 位吗?
【发布时间】:2020-01-14 17:31:24
【问题描述】:

我正在使用 Koen Vos 在“Burg 方法的快速实现”中提出的方法制作 Burg 算法的 C# 版本。

我使用 GNU Octave arburg 函数来比较结果。 当我在 C# 代码中对内部变量使用 decimal 时,测试结果几乎相同(精度为 0.0000000000001),但当我使用 double 时(精度为 0.01)则完全不同。

据我所知GNU Octave uses 64-bit precision for floats,不是 128 位。我错了吗?

/* Coefficients for comparision are taken from GNU Octave arburg() 
* t = [0:2000];
* x = sin( 2 * pi() * t / (512 / 5.2));
* output_precision(16)
* [a, v, k] = arburg(x(1:512), 4)
*/

C#代码300多行,我觉得还是不要放这里比较好。

我认为要么是 GNU Octave 在后台使用 128 位精度,要么是我的 C# 代码有错误,而提高计算精度可以以某种方式缓解这个错误。

问题是 GNU Octave(或 Matlab)中的浮点数据可能是 128 位内部的吗?

【问题讨论】:

  • 最好将您的结果与论文中发表的结果进行比较。
  • 论文中有些东西可以用不止一种方式来解释。不知道你是否熟悉这篇论文?
  • 不,我不知道。我的意思是,论文中发布的结果比您通过 octave 或任何其他工具等软件实现获得的结果更可靠。

标签: c# signal-processing octave


【解决方案1】:

Octave 默认使用 64 位浮点数,没有办法强制它使用更高的精度。它只知道double(64 位浮点数)和single(32 位浮点数)。

英特尔(和兼容的)处理器可以使用 80 位浮点数进行计算(在 C 中是 long double),但它们不支持 128 位浮点数。有些软件可能会模拟 128 位浮点数以提高精度,但 Octave 不是其中之一(MATLAB 也不是)。

【讨论】:

  • C# decimal 是我所知道的 128 位浮点数。不过,我认为它不受硬件支持。
  • 相关:Wikipedia: Quadruple-precision floating point implementations。有一些硬件实现,但主要是在软件中处理。
  • Fortran 使用 quadruple 精度浮​​点数(模拟,因为 FPU 不支持)en.wikipedia.org/wiki/Quadruple-precision_floating-point_format
  • 符号 vpa 除外。
  • @rahnema1:当然,还有其他模拟更高精度的包,但这些不是内置类型。 vpa 返回类 sym 的对象,而不是内置类型。 Octave 本身并不知道这些类型。我认为 OP 会知道他们的代码是否使用了vpa
猜你喜欢
  • 2023-03-03
  • 2018-02-23
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多