Несоответствие спецификаторам формата gnuplot% t и% T? - PullRequest
2 голосов
/ 12 марта 2019

Если вы используете спецификаторы формата gnuplot %t и %T, вы увидите некоторые противоречивые действия.

### gnuplot format specifiers

Numbers = "94 95 99 100 101"

do for [n in Numbers] {
    print gprintf("%3g",n)." = ".gprintf("%t",n)." x 10^".gprintf("%T",n)
}

Mantissa(n) = real(n)/10**floor(log10(n))
Power(n) = floor(log10(n))
do for [n in Numbers] {
    print gprintf("%3g",n)." = ",Mantissa(n)," x 10^",Power(n)
}
### end of code

Результат:

 94 = 9.400000 x 10^1
 95 = 0.950000 x 10^2
 99 = 0.990000 x 10^2
100 = 1.000000 x 10^2
101 = 1.010000 x 10^2
 94 = 9.4 x 10^1
 95 = 9.5 x 10^1
 99 = 9.9 x 10^1
100 = 1.0 x 10^2
101 = 1.01 x 10^2

Почему, например, 95 отображается как 0.95 x 10^2 вместо 9.5 x 10^1? В чем причина этого?

1 Ответ

1 голос
/ 30 марта 2019

На самом деле, кроме gprintf("%t",95) и gprintf("%T",95), не показывающих ожидаемую мантиссу и силу, также формула floor(log10(n)) иногда не показывает правильную мощность n. (см. здесь: gnuplot: как получить правильный порядок величины? )

Предложение для обходного пути: следующие формулы делают обход через форматирование строки, но, по крайней мере, они всегда должны давать правильную мантиссу и силу.

Mantissa(n) = real(sprintf("%.15e",n)[1:strstrt(sprintf("%.15e",n),"e")-1])

Power(n) = int(sprintf("%.15e",n)[strstrt(sprintf("%.15e",n),"e")+1:])

В долгосрочной перспективе функции gprintf("%t",...), gprintf("%T",...) должны быть исправлены в исходном коде gnuplot.

...