- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我们有以下代码:
base = vpa(1);
height = vpa(2.2);
mod(2*base + height + height, 2 * (base + height))
这将产生 6.4 的输出。我希望结果为 0,数值解确实给出 0。但我需要使用符号值
vpa()
.
simplify(2*base + height + height < 6.4)
simplify(2 * (base + height) == 6.4)
都给
TRUE
.所以相同的(数字)表达式更小,等于 6.4。
最佳答案
问题是vpa
提供任意大的精度,但 不准确 .首先,请注意 vpa
第二个输入使用 digits
精度位数,即 32
默认情况下。当你做
height = vpa(2.2)
这与
height = vpa(2.2, 32)
假设
digits
是
32
.所以
height
将有
32
精度的数字,但不会精确。要看到这一点,请评估定义的
height
更精确:
>> vpa(height, 32)
ans =
2.2
>> vpa(height, 40)
ans =
2.2
>> vpa(height, 50)
ans =
2.2000000000000000000000000000000000000001469367939
这种不准确导致了
2*base + height + height
之间的数值差异。和
2 * (base + height)
,这两者实际上都不等于
6.4
:
>> base = vpa(1);
>> height = vpa(2.2);
>> vpa(2*base + height + height, 50)
ans =
6.3999999999999999999999999999999999999988245056492
>> vpa(2 * (base + height), 50)
ans =
6.4000000000000000000000000000000000000002938735877
结果,即使
mod(2*base + height + height, 2 * (base + height))
好像是
0
>> mod(2*base + height + height, 2 * (base + height))
ans =
6.4
but it's _not_:
>> vpa(mod(2*base + height + height, 2 * (base + height)), 50)
ans =
6.3999999999999999999999999999999999999988245056492
注意与
6.4
的偏差后一个结果不等于上述两个小偏差的总和;相反,它等于第一个。不保证数值不准确是可加性的。
vpa
减少但不能完全避免数值精度误差 .
vpa
的位数会怎样? ?这会提供更高的精度并可能解决问题吗?
>> base = vpa(1, 1000);
>> height = vpa(2.2, 1000);
奇怪的是,尽管使用了更多的数字,我们还是得到了和以前一样的不准确:
>> vpa(2*base + height + height, 50)
ans =
6.3999999999999999999999999999999999999988245056492
>> vpa(2 * (base + height), 50)
ans =
6.4000000000000000000000000000000000000002938735877
>> vpa(mod(2*base + height + height, 2 * (base + height)), 50)
ans =
6.3999999999999999999999999999999999999988245056492
vpa
来自
符号变量 , 分别是
精确 :
>> base = sym(1)
base =
1
>> height = sym(2.2)
height =
11/5
关于如何定义符号变量的题外话是有序的。请注意
sym(2.2)
有它首先定义的潜在问题
2.2
作为
double
浮点数,其固有的不准确性,然后将其转换为
sym
.在这种情况下,这不是问题,因为
2.2
的浮点数值表示恰好是准确的。事实上,我们可以检查 Matlab 是否显示
height = sym(2.2)
,这是准确的。此外,即使
double
表示不准确,Matlab 会尝试猜测您的意图,并且通常会成功:
>> sym(3.141592653589793)
ans =
pi
(Matlab 假设我们指的是数字 pi)...但并非总是如此:
>> sym(sqrt(777))
ans =
777^(1/2)
>> sym(sqrt(777777))
ans =
7757421003204227/8796093022208
(
sqrt(777)
给出
double
结果
27.874719729532707
,它被
sym
识别为
777
的平方根的近似值。另一方面,
sqrt(777777)
给出了 |114| 不识别的 7由
8.819166627295348e+02
作为
sym
的平方根的近似值)。
>> sym(7777)
ans =
7777
>> sym(7777777777777777777)
ans =
7777777777777777664
(
777777
完全表示为
7777
,但
double
不是,因为它超过了
7777777777777777777
。)
>> height = sym('22/10')
height =
11/5
现在,与
2^53
和
base
正确定义为符号变量,我们得到预期的结果:
>> mod(2*base + height + height, 2 * (base + height))
ans =
0
>> vpa(mod(2*base + height + height, 2 * (base + height)), 1000)
ans =
0.0
关于MATLAB 使用 vpa() 时 mod() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62788258/
尝试使用 vpa() 为指数中的有理表达式计算变量点数: syms x; ans1 = x^(12345/67890) ans2 = vpa(x^(12345/67890),3) ans2_5 = v
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
为了项目的需要,我在 GKE 上创建了 2 个 Kubernetes 集群。 集群 1 : 一个 Pod 中有 10 个容器 集群 2 :10 个不同 Pod 中的 10 个容器 所有的容器都连接起来
如果我们有以下代码: base = vpa(1); height = vpa(2.2); mod(2*base + height + height, 2 * (base + height)) 这将产生
我已将集群上的 VPA 启用为只读模式并尝试收集 VPA 推荐数据。但是我找不到特定于 Vertical Pod Autoscaling 的好的文档或任何 API 详细信息。我为 Horizont
假设我需要非常高的计算精度,或者我正在处理的程序对数值错误非常敏感。在 Matlab 中,我可以这样做: d = 30; digits(d); t = vpa(1); H = vpa(zeros(2,
我是一名优秀的程序员,十分优秀!