Octave:如何从文件中读取格式化的输入

问题描述

我需要从一个 txt 文件中读取所有 15 个十进制数字并将它们存储到一个数组中。我找不到如何调用this 这样的格式的例子很好的答案,所以我为类似的事情付出了很多努力,我认为现在是提问的最佳时机。有什么帮助吗?

fileID = fopen('data.txt','r')
formatSpec = format long G 
A = fscanf(fileID,formatSpec)
fclose('data.txt')

数字就像:

 4.92999929999999972
 5.92456845523467798 
 8.93491235999999996

解决方法

如果我将您的号码粘贴到名为 data.txt 的文件中,然后运行

x = load("data.txt");
format long
x

打印出来:

x =

    4.929999300000000
    5.924568455234678
    8.934912360000000

这些已四舍五入为 16 位有效数字,因为这是 Octave 存储数据的最大精度。您的号码有 18 个无花果,但我不知道有任何存储方式。如果您需要更高的精度,那么我不认为它在 Octave 中可用,尽管它看起来像是开发人员的愿望清单,请参阅:https://wiki.octave.org/Projects#High_Precision_Arithmetic_Computation

编辑发布以回应下面的评论。

我认为在 Octave 中没有任何方法可以使用更高精度的数字。 64 位是处理器的字长,因此必须在软件中实现更高精度的算术,而 Octave 尚未做到这一点。根据 Octave 手册,存储数字的默认格式是 IEEE 754 双精度 (binary64) 浮点格式(请参阅:https://en.wikipedia.org/wiki/Double-precision_floating-point_format)。这使用 64 位,其中 1 位用于符号,11 位用于指数,52 位用于小数部分(即实际数字本身)。在十进制中, 2^52 = 4503599627370496 是 16 位长,因此 64 位为您提供 15 或 16 个十进制 sig.figs,具体取决于数字的小数部分的值。有一个可用于 Matlab (https://www.advanpix.com/) 的工具箱,声称可以启用任意精度的浮点数,但 Matlab 和工具箱都是商业用途且非常昂贵。 Python numpy 包具有一些更高精度的数据类型。我还没有尝试过这些,但从我读到的内容来看,它们效果不佳。

如果您只想打印出您的数字,您可以将它们作为字符串元胞数组导入,如下所示:

filename = "data.txt";
fid = fopen (filename,"r");
x = textscan (fid,"%s");
fclose (fid);

然后在终端输入 x 打印出来:

x =
{
[1,1] =
{
    [1,1] = 4.92999929999999972
    [2,1] = 5.92456845523467798
    [3,1] = 8.93491235999999996
}

}

但这些是字符串,您不能用它们进行计算。您可以使用函数 str2double() 将它们转换为数字,但随后它们将被截断为 16 sig。无花果。然后你又回到了开始的地方。

实际上,16 个信号。无花果。对于大多数用途来说应该足够了。为了比较,一个氢原子的直径大约是1埃单位=10^(-10)m,而1000km等于10^6m,所以1000km中有10^16埃,所以16位有效数字足以定位1000 公里的氢原子。只有在解决“蝴蝶效应”的问题时才需要更高的精度,在这种情况下,任意少量都可以“爆炸”。