gnuplot:如何获得正确的数量级?

时间:2019-03-18 22:50:14

标签: gnuplot logarithm rounding-error

这个问题/问题可能与this topic有某种联系。

如果您输入:

print log10(1e7),您将获得7.0

print int(log10(1e7)),您将获得7

但是,如果您键入

print log10(1e6),您将获得6.0

print int(log10(1e6)),您将获得5

这些可能是与log10相关的舍入错误,无法避免(?)。

因为您键入

print sprintf("%.20e",log10(1e6))给出5.99999999999999911182e+00

print sprintf("%.20e",log10(1e7))给出7.00000000000000000000e+00

您可以将其扩展并总结为图表: 代码:

### power problem in gnuplot
reset session
set colorsequence classic
set key left
set samples 41

set xrange[-20:20]
plot int(log10(10**x)) w lp pt 7,\
    x w lp pt 7
### end of code

结果:

enter image description here

您会看到,在不规则的距离内,预期结果和获得的结果之间会有差异。

因此,我仍然缺少能够始终为我提供正确数量级的函数。也许将所有数字都舍入到小数点后15位?还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

假设您处理的位数不超过12-15位(或者@Ethan说在64位系统中的位数超过15-16位是无意义的),则以下函数应给出正确的数量级(整数) 。我只是测试了一些示例,并将其与其他“直接”方法进行了比较。请证明功能的正确与错误。

### get the correct power of a number with gnuplot

CorrectPower(n) = floor(log10(n*(1+1e-15)))
IncorrectPower1(n) = floor(log10(n))
IncorrectPower2(n) = floor(gprintf("%T",n))

Numbers = "1e-6 1e-4 0.001 0.01 1e-2 1000 1000000 -1e-6 -1e-9 0.99 95 990"

print " Number    cP  icP1 icP2"
do for [i=1:words(Numbers)] {
    n = word(Numbers,i)
    print \
        sprintf("%7s:%5d%5d%5d", n, CorrectPower(n), IncorrectPower1(n), IncorrectPower2(n))
}
### end of code

结果:

 Number    cP  icP1 icP2
   1e-6:   -6   -5   -6
   1e-4:   -4   -3   -4
  0.001:   -3   -2   -3
   0.01:   -2   -1   -2
   1e-2:   -2   -1   -2
   1000:    3    2    3
1000000:    6    5    6
  -1e-6:   -6   -5   -6
  -1e-9:   -9   -8   -9
   0.99:   -1    0    0
     95:    1    1    2
    990:    2    2    3

加法:值得一提的是,另一个函数以整数形式获得正确的幂:

CorrectPower2(n) = int(sprintf("%.15e",n)[19:])