gnuplot:无声错误读取(非标准形式)科学格式数字
gnuplot: silent error reading (non-standard form of) scientific format numbers
编辑: 因为我发现了问题,所以我已经更正了问题。
我有一个程序可以生成数据供 GNUPlot 绘图。一切正常,除了一件事:程序生成的数据是双浮点格式,并且此数据的可打印表示形式是,例如 1.2d0
或 6.3d-5
(Common Lisp 的标准表示形式)。
然而,GNUPlot 需要 1.2
或 6.3e-5
形式的数字。也许,GNUPlot 可能会在读取数据时发出警告,但由于所有数据都通过管道传输,因此不会显示。所以,发生了什么:GNUPlot 愉快地读取数字,直到它遇到 dXXX
后缀并静静地丢弃它。这导致了一些意想不到的事情。例如,要从程序中绘制 y=sin(x)
,x=pi
附近的数据线如下所示
2.9670597283903604d0 0.17364817766693028d0
3.141592653589793d0 1.2246467991473532d-16
3.3161255787892263d0 -0.17364817766693047d0
因此,对于 x=3.14159...
,GNUPlot 读取 y=1.2246...
而不是 y=1.2246...e-16
。情节有一个意想不到的尖峰(见下文)。
我的解决方案:将数据转换为单浮点数或更改双浮点数的可打印表示形式。
Fortran 也使用该格式。 Gnuplot 提供了一个选项来启用检查数据文件中的 D
和 Q
常量:
set datafile fortran
plot '-' using 1:2 w lp
2.9670597283903604d0 0.17364817766693028d0
3.141592653589793d0 1.2246467991473532d-16
3.3161255787892263d0 -0.17364817766693047d0
e
根据文档,默认情况下未启用该选项,因为它会减慢输入过程。
编辑: 因为我发现了问题,所以我已经更正了问题。
我有一个程序可以生成数据供 GNUPlot 绘图。一切正常,除了一件事:程序生成的数据是双浮点格式,并且此数据的可打印表示形式是,例如 1.2d0
或 6.3d-5
(Common Lisp 的标准表示形式)。
GNUPlot 需要 1.2
或 6.3e-5
形式的数字。也许,GNUPlot 可能会在读取数据时发出警告,但由于所有数据都通过管道传输,因此不会显示。所以,发生了什么:GNUPlot 愉快地读取数字,直到它遇到 dXXX
后缀并静静地丢弃它。这导致了一些意想不到的事情。例如,要从程序中绘制 y=sin(x)
,x=pi
附近的数据线如下所示
2.9670597283903604d0 0.17364817766693028d0
3.141592653589793d0 1.2246467991473532d-16
3.3161255787892263d0 -0.17364817766693047d0
因此,对于 x=3.14159...
,GNUPlot 读取 y=1.2246...
而不是 y=1.2246...e-16
。情节有一个意想不到的尖峰(见下文)。
我的解决方案:将数据转换为单浮点数或更改双浮点数的可打印表示形式。
Fortran 也使用该格式。 Gnuplot 提供了一个选项来启用检查数据文件中的 D
和 Q
常量:
set datafile fortran
plot '-' using 1:2 w lp
2.9670597283903604d0 0.17364817766693028d0
3.141592653589793d0 1.2246467991473532d-16
3.3161255787892263d0 -0.17364817766693047d0
e
根据文档,默认情况下未启用该选项,因为它会减慢输入过程。