在Maxima中,我这样做:
(%i1) 1.4*28;
(%o1) 39.2
(%i2) is(1.4*28=39.2);
(%o2) false这对我来说很奇怪,但可能与rat替换有关?
有没有办法让maxima对is(1.4*28=39.2);的输入返回'true‘
发布于 2011-06-13 05:51:41
来自The Floating-Point Guide
为什么我的数字,比如0.1 + 0.2加起来不是一个很好的整数0.3,而是得到了一个奇怪的结果,比如0.30000000000000004?
因为在内部,计算机使用的格式(二进制浮点)根本不能准确地表示像0.1、0.2或0.3这样的数字。
当编译或解释代码时,您的“0.1”已经四舍五入到该格式的最接近的数字,这导致即使在计算发生之前也会产生很小的舍入误差。
在您的例子中,1.4和39.2都不能精确地表示为二进制分数,并且计算结果最终以与文字39.2不同的四舍五入方式结束。
如果你想避免这样的问题,你必须避免使用二进制浮点数。我认为在Maxima中,这最容易通过使用适当的分数来完成:
is(14/10 * 28 = 392/10)应该行得通
发布于 2011-07-28 08:04:44
由于“常规”计算器会把这些问题弄错,有时,不清楚什么才能真正解决你的问题。如果你正在设置一个自动化的算术测试,看看人们是否能得到正确的答案,那么也许你应该测试的是达到一定容差的一致性。
(你的计算器的例子可以通过计算1.0/3.0的变化,然后乘以3来构造。你可能会得到0.9999...。一些计算器比其他计算器更圆滑,所以示例必须稍微微妙一些。如1.0/30.0 X 30.0)
回到Maxima,您可以测试abs(a-b)是否<容差,或者abs((a-b)/max(a,b)) <相对容差。
现在,如果真正能解决问题的是输出精度较低,那么只需设置fpprintprec:5以获得5位小数(四舍五入)即可。
另一种选择是读取你的数字,这样3.1实际上永远不会被转换成二进制,而是最初被解析为3+1/10。从那时起,所有的有理运算都可以准确地完成。(有理算术不包括平方根、对数、余弦...,仅+-*/和整数幂)。现在这不是Maxima的一部分。
顺便说一下,您的0.1+0.2示例在wxmaxima的显示中显示为0.3。但它隐藏了实际值,因为%-3/10实际上不是零。使用fpprec:50;我们可以表示0.3,仍然是二进制的,但通过键入0.3b0可以表示更多的数字。
0.1+0.2-0.3b0;给出4.440892098500626161694526672363281263363823550461b-17
哦,如果您对Maxima将浮点数转换为有理数的消息感到担忧,请设置ratprint:false。它不会改变计算,只会改变警告。
https://stackoverflow.com/questions/6245142
复制相似问题