比较sag中的两个数字

2024-03-29 07:03:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如第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 是的

但如§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 假

在我的项目中,我想比较可以四舍五入的用户答案(例如,小数点后3位)和53位CAS解决方案(可以是符号值和数字值)。桑克斯


Tags: 项目vartype错误sinonlineboolr2
1条回答
网友
1楼 · 发布于 2024-03-29 07:03:16

首先请注意,声明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

数字精度的工作方式与截断不完全相同,它保留了一些额外的信息以保持精确。你知道吗

寓意:除非你真的明白实数和电脑里的数字不一样,否则对数字运算要非常小心。幸运的是,从最实际的角度来看,约翰的评论可以很好地为你服务,否则我就有麻烦了,因为我绝对不是一个数字分析师。你知道吗

相关问题 更多 >