在圣人中比较两个数字

时间:2018-06-04 15:58:42

标签: python numbers numeric sage

我想知道为什么通过比较sage cas online中的两个实数(例如bool(r1 == r2)),它会返回错误的布尔值。

E.g.§1:

(x,y,z)=var('x,y,z');
x=2
r1= (sin(x)).n()
r2= (sin(x)).n(digits=3)
print r1, type(r1)
print r2, type(r2)
bool(r1==r2)

0.909297426825682 == 0.909 真

但是E.g.§2

(x,y,z)=var('x,y,z');
x=2
r1= (sin(x)).n()
r2= (0.909).n(digits=3)
print r1, type(r1)
print r2, type(r2)
bool(r1==r2)

0.909297426825682 == 0.909 假

或者例如§3

(x,y,z)=var('x,y,z');
x=2
r1= 0.909297426825682.n(digits=3)
r2= (0.909).n(digits=3)
print r1, type(r1)
print r2, type(r2)
bool(r1==r2)

0.909 == 0.909 假

在我的项目中,我想比较一下可以舍入的用户答案,例如:使用53位CAS解决方案解决方案的3位小数,可以是符号值和数值。感谢名单

1 个答案:

答案 0 :(得分:0)

首先请注意,声明x,y,z为变量不是您想要的,因为这是一个符号变量。您可以无序地进行x=2。我希望那不是真的,但是有帮助。

关于您的问题,您的电话号码实际上有所不同。它们的打印方式不是内部表示。

sage: s1= (sin(x)).n()
....: s2= (sin(x)).n(digits=3)
sage: r1= (sin(x)).n()
....: r2= (0.909).n(digits=3)
....: 
sage: s2 == r2
False
sage: s2 - r2
0.000305
sage: s2.sign_mantissa_exponent()
(1, 14898, -14)
sage: r2.sign_mantissa_exponent()
(1, 14893, -14)

您可以看到它们在计算机上的代表略有不同,这可能是由于原始差异

sage: sin(2.)
0.909297426825682
sage: 0.909
0.909000000000000

sage: r1 - s1
0.000000000000000

数字精度的工作方式与截断并不完全相同,并且保留了一些额外的信息以保持精度。

道德:除非您真的了解实数与计算机中的数字不同,否则请务必小心数字运算。幸运的是,出于大多数实际目的,John的评论对您很有帮助,否则我一定会遇到麻烦,因为他绝对不是数字分析师。