Floating point maxima CAS:更换浮动鼠

Floating point maxima CAS:更换浮动鼠,floating-point,cas,maxima,Floating Point,Cas,Maxima,在Maxima中,我做: (%i1) 1.4*28; (%o1) 39.2 (%i2) is(1.4*28=39.2); (%o2) false 这对我来说很奇怪,但可能与老鼠有关 有没有办法让maxima将“true”返回到 is(1.4*28=39.2)?来自: 为什么我的数字,比如0.1+0.2加起来不等于0.3,然后 相反,我得到了一个奇怪的结果,比如 300000000000000004? 因为在内部,计算机使用 格式(二进制浮点)为 不能准确地表示一个数字 比如0.1、0.2

在Maxima中,我做:

(%i1) 1.4*28;

(%o1) 39.2

(%i2) is(1.4*28=39.2);

(%o2) false
这对我来说很奇怪,但可能与老鼠有关

有没有办法让maxima将“true”返回到
is(1.4*28=39.2)

来自:

为什么我的数字,比如0.1+0.2加起来不等于0.3,然后 相反,我得到了一个奇怪的结果,比如 300000000000000004?

因为在内部,计算机使用 格式(二进制浮点)为 不能准确地表示一个数字 比如0.1、0.2或0.3

当代码被编译或 已解释,您的“0.1”已 四舍五入到该表中最接近的数字 格式,这将导致 舍入误差甚至在 计算发生了

在您的例子中,1.4和39.2都不能精确地表示为二进制分数,计算结果的取整方式与文字39.2不同

如果要避免此类问题,必须避免使用二进制浮点。我认为在Maxima中,使用适当的分数最容易做到这一点:

is(14/10 * 28 = 392/10)
应在以下位置工作:

为什么我的数字,比如0.1+0.2加起来不等于0.3,然后 相反,我得到了一个奇怪的结果,比如 300000000000000004?

因为在内部,计算机使用 格式(二进制浮点)为 不能准确地表示一个数字 比如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)

回到最大值,您可以测试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。它不会改变计算,只会改变警告。

因为“普通”计算器会出错,有时,不清楚什么才能真正解决您的问题。如果你正在设置一个自动算术测试,看看人们是否能得到正确的答案,那么也许你应该测试的是在一定程度上的一致性

(计算器的示例可以通过计算1.0/3.0的变化量,然后乘以3来构建。您可能会得到0.9999…有些计算器比其他计算器更精确,因此示例必须稍微精细一些。例如1.0/30.0 X 30.0)

回到最大值,您可以测试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。它不会改变计算,只是警告。

谢谢Michael。事实上,maxima更喜欢理性,你对我的问题描述得很好。但是,您的solutino不适合我,因为我得到的用户输入可以是任何内容;尤其是花车将被大量使用。maxima有没有办法作为一个“常规”的浮动计算器?谢谢Michael。事实上,maxima更喜欢理性,你对我的问题描述得很好。但是,您的solutino不适合我,因为我得到的用户输入可以是任何内容;尤其是花车将被大量使用。maxima是否有办法成为一名注册会计师