在千里马我做:
(%i1) 1.4*28;
(%o1) 39.2
(%i2) is(1.4*28=39.2);
(%o2) false
这对我来说很奇怪,但可能与老鼠更换有关?
有没有办法让最大值返回 'true' 的输入
is(1.4*28=39.2);
?
在千里马我做:
(%i1) 1.4*28;
(%o1) 39.2
(%i2) is(1.4*28=39.2);
(%o2) false
这对我来说很奇怪,但可能与老鼠更换有关?
有没有办法让最大值返回 'true' 的输入
is(1.4*28=39.2);
?
来自浮点指南:
为什么我的数字,比如 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)
应该管用
由于“常规”计算器会错误地回答此类问题,因此有时不清楚什么会真正解决您的问题。如果您正在设置一个自动算术测试以查看人们是否可以得到正确的答案,那么您应该测试的可能是在一定的公差范围内达成一致。
(您的计算器的示例可以通过计算 1.0/3.0 的变化然后乘以 3 来构建。您可能会得到 0.9999...。有些计算器比其他计算器四舍五入,所以示例必须稍微更微妙。比如 1.0/30.0 X 30.0)
回到 Maxima,您可以测试是否 abs(ab)< 容差,或者可能是 abs((ab)/max(a,b)) < relativetolerance。
现在,如果真正解决您的问题的只是输出精度较低,您可以设置 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。它不会改变计算,只是警告。