15.4.8.3精度问题

OpenGL图形工具包("qt""fltk")使用单精度进行渲染。此限制特别适用于使用的时间序列相对于串行日期的绘图datenum, datestr,datestructdatetick函数。

序列日期将时间戳编码为自零年以来的天数,以小时、分钟、秒为小数部分。1999年12月31日,序列号表示为730485。具有该整数部分的双精度变量允许其小数部分的分辨率为1.2e-10,表示为5微秒。但在单精度下,分辨率降低到0.06左右,即45分钟。任何试图以更精细的粒度绘制带有时间戳的数据的行为都会导致图形失真。

作为一种变通方法,可以使用"gnuplot"图形工具包减去2000年——即。,datenum (2000, 0, 0)或730485——来自时间值。从于日历结构体每2000年重复一次,年、月、日和周之间的关系将保持不变datetick函数仍然正确。只有几年才会缺少千年数字。因此,“2020”将被打印为“20”。例如

# timestamps of 24 hours in one minute steps
t = datenum (2020, 1, 1):(1/1440):datenum (2020, 1, 2);

# some example time series data
x = -cos (2*pi*t) + rand (size (t)) / 10;

subplot (1, 2, 1);
plot (t, x);
datetick ("x");
xlabel ("serial date");
title ("problem");

subplot (1, 2, 2);
plot (t - 730485, x);
datetick ("x");
xlabel ("2000 years off");
title ("workaround");

其结果可以在中看到图15.8.

precisiondate

图15.8:OpenGL图形工具包的单精度问题

同样,其他数据也可以被翻译或重新缩放以解决这个问题。


版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2