首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >maxima CAS:已替换浮动rat

maxima CAS:已替换浮动rat
EN

Stack Overflow用户
提问于 2011-06-06 03:01:41
回答 2查看 2.4K关注 0票数 1

在Maxima中,我这样做:

代码语言:javascript
复制
(%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‘

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中,这最容易通过使用适当的分数来完成:

代码语言:javascript
复制
is(14/10 * 28 = 392/10)

应该行得通

票数 3
EN

Stack Overflow用户

发布于 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。它不会改变计算,只会改变警告。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6245142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档