我想将一些 FrameTicks
放入 Plot
中
xticks = Range[-2, 2, 0.2]
得到了
{-2., -1.8, -1.6, -1.4, -1.2, -1., -0.8, -0.6, -0.4, -0.2,
1.11022*10^-16, 0.2, 0.4, 0.6, 0.8, 1., 1.2, 1.4, 1.6, 1.8, 2.}
所以有一个小数字而不是零。
使用Table
给出相同的输出:
Table[k, {k, -2, 2, 0.2}]
{-2., -1.8, -1.6, -1.4, -1.2, -1., -0.8, -0.6, -0.4, -0.2,
1.11022*10^-16, 0.2, 0.4, 0.6, 0.8, 1., 1.2, 1.4, 1.6, 1.8, 2.}
但是使用0.25
作为步长值,一切都很好:
xticks = Range[-2, 2, 0.25]
{-2., -1.75, -1.5, -1.25, -1., -0.75, -0.5, -0.25, 0., 0.25, 0.5, \
0.75, 1., 1.25, 1.5, 1.75, 2.}
如何替换小数字并将其设置为零?
最佳答案
TL;博士:
考虑使用:
Range[-20, 20, 2]/10
可以选择将它们转换为浮点:
N[Range[-20, 20, 2]/10]`
0
实际发生了什么:
Range[-2, 2, 0.2]
使用浮点运算,因此在某些时候它会得到某个 n
,这是 的浮点近似值-0.2
并添加 0.2f
:结果不可能是 0
- 我们位于域 F -,它可以在最好是 0.
或其他相当接近的近似值(另请参阅: The difference between 0.
and 0
)。
“相当接近”到底有多接近?
Floating point subtraction between really close values is notoriously tricky ,并且这可能就是为什么 2.0, 1.8, ...
看起来不错,但通过 -0.2f + 0.2f
获得的零近似值是 丑陋。
另一方面,Range[-20, 20, 2]
适用于自然数,N 中的 -2 + 2
为普通 0
(固定精度算术并不像浮点那么棘手)。
然后 Range[-20, 20, 2]/10
映射到 Q(其中任何带有 p 的 p/q = 0 仍然很容易计算为 0)。
您还可以chop使用 Chop[Range[-2, 2, 0.2]]
可以 float 到任意精度。
关于floating-point - Range 给了我其他东西来代替 0,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31637551/