floating-point - Range 给了我其他东西来代替 0,为什么?

标签 floating-point range wolfram-mathematica numerical-stability

我想将一些 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/

相关文章:

c# - 中断使用 Enumerable.Range 的 IEnumerable<int> 查询

vba - 如何使用 RefersToRange?

wolfram-mathematica - 提高(或替代)RegionPlot 的速度

java - double 混淆?

C#:将 float 表达式转换为 int 时结果错误

arrays - 将范围传递给 Excel 用户定义函数并将其分配给数组

wolfram-mathematica - 在 mathematica 中获取 listplot 的点数

c# - 将 float 和 double 值与 delta 进行比较?

c# - 在 C# 中调用时执行 Double & Float 方法参数

wolfram-mathematica - Mathematica 中 Manipulate[] 的自定义 Controller