15.4.8.3 Precision issues

Last-modified: 2025-03-15 (土) 20:32:05

15.4.8.3 精度の問題

OpenGL グラフィックス ツールキット ("qt"および) は、"fltk"レンダリングに単精度を使用します。この制限はdatenum、、、、datestrおよび 関数で使用されるシリアル日付に対する時系列のプロットに特に適用されます。 datestructdatetick

シリアル日付は、タイムスタンプを 0 年から経過した日数としてエンコードし、小数部として時間、分、秒を使用します。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");
The result of which can be seen in Figure 15.8.

precisiondate.png
図15.8: OpenGLグラフィックツールキットの単精度の問題

同様に、他のデータを変換したり、再スケーリングしたりすることで、この問題を回避することができます。