浮点数的八度精度:引擎盖下是 128 位吗?
Octave precision for floats: Is it 128 bit under the hood?
我正在使用 Koen Vos 在 "A Fast Implementation of Burg’s Method" 中提出的方法制作 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 默认使用 64 位浮点数,没有办法强制它使用更高的精度。它只知道 double
(64 位浮点数)和 single
(32 位浮点数)。
Intel(和兼容)处理器可以使用 80 位浮点数进行计算(在 C 中是 long double
),但它们不支持 128 位浮点数。某些软件可能会模拟 128 位浮点数以提高精度,但 Octave 不是其中之一(MATLAB 也不是)。
我正在使用 Koen Vos 在 "A Fast Implementation of Burg’s Method" 中提出的方法制作 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 默认使用 64 位浮点数,没有办法强制它使用更高的精度。它只知道 double
(64 位浮点数)和 single
(32 位浮点数)。
Intel(和兼容)处理器可以使用 80 位浮点数进行计算(在 C 中是 long double
),但它们不支持 128 位浮点数。某些软件可能会模拟 128 位浮点数以提高精度,但 Octave 不是其中之一(MATLAB 也不是)。