我想知道为什么通过比较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位小数,可以是符号值和数值。感谢名单
答案 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的评论对您很有帮助,否则我一定会遇到麻烦,因为他绝对不是数字分析师。