gnuplot:静默错误读取(非标准形式)科学格式数字

Posted

技术标签:

【中文标题】gnuplot:静默错误读取(非标准形式)科学格式数字【英文标题】:gnuplot: silent error reading (non-standard form of) scientific format numbers 【发布时间】:2016-01-22 09:50:28 【问题描述】:

编辑:因为我发现了问题,所以我已经更正了问题。

我有一个程序可以为 GNUPlot 生成数据以进行绘图。一切正常,除了一件事:程序生成的数据是双浮点格式,并且该数据的可打印表示形式是 1.2d06.3d-5(Common Lisp 的标准表示形式)。

但是,GNUPlot 需要1.26.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。并且情节出现了意外的峰值(见下文)。

在我的情况下的解决方案:将数据转换为单浮点数或更改双浮点数的可打印表示。

【问题讨论】:

我从未见过这样的错误,请在您正在使用的文件中显示脚本和原始数据行。 我想我找到了错误所在。该点的数据行看起来像这样3.141592653589793d0 1.2246467991473532d-16——所以,双浮点数最后用dXXX格式化。感觉GNUPlot无法读取这种形式的数字,需要eXXX。所以如果最后一个数字写成1.2246...e-16 就没有问题了。 @Christoph 错误确实如上所说。我已更正问题以反映这一点。 【参考方案1】:

Fortran 也使用这种格式。 Gnuplot 提供了一个选项来检查数据文件中的DQ 常量:

set datafile fortran

plot '-' using 1:2 w lp
2.9670597283903604d0 0.17364817766693028d0
3.141592653589793d0 1.2246467991473532d-16
3.3161255787892263d0 -0.17364817766693047d0
e

根据文档,该选项默认不启用,因为它会减慢输入过程。

【讨论】:

以上是关于gnuplot:静默错误读取(非标准形式)科学格式数字的主要内容,如果未能解决你的问题,请参考以下文章

gnuplot 如何从文件读取数据

是否有用于转换非标准科学记数法的 R 函数?

如何界定标准化管理与非标准化管理

Excel 错误地读取了 csv 中的科学格式数字

如何让 Gnuplot 不裁剪科学记数法

C语言从标准输入读取字符,所有非字母字符完全按照输入形式输出,字母字符在输出前加密