Floating point maxima CAS:更换浮动鼠
在Maxima中,我做: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
(%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是否有办法成为一名注册会计师