S seagull Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-09 #1 各位先生: 我需要对一些实数类型进行大小判断,精度到1e-10,但两个完全一致的 数字判断出来就不相等,由于算法需要,必须判断,请问有什么好的方法吗?
N ningliu Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-09 #3 为什么不将两个数相减,如果其差小于某个值(如1e-10)就认为相等。 本来在科学计算中判断相等都是先确定一个误差,只要两数差距不超过这个 值就认为相等。
D DJ. Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-09 #5 方栩 的方法错 ningliu 说的等于没回答,你又怎知差小于给定值(如1e-10)的呢?所以也不对
Z zhaoyipeng Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-09 #6 procedure TForm1.Button1Click(Sender: TObject); var a1, a2, a3:do uble; begin a1 := 1.00000000001; a2 := 1.0; a3 := a1 - a2; if a3 < 0.0000000001 then begin application.messagebox('', '<1e-10',0); end; end; 试试这个,实在写得太遭了,但能说明问题.
procedure TForm1.Button1Click(Sender: TObject); var a1, a2, a3:do uble; begin a1 := 1.00000000001; a2 := 1.0; a3 := a1 - a2; if a3 < 0.0000000001 then begin application.messagebox('', '<1e-10',0); end; end; 试试这个,实在写得太遭了,但能说明问题.
S seagull Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-09 #7 先生们: 问题的关键在于我不能确定比较的数值到底是小数点后多少位。 For Example,设比较的数值为1.0000001和1.0000001,如果 我将精度设为1e-7,那么它们就相等了,但如果设为1e-15;就很可 能不相等,如何是好呢? Please!
先生们: 问题的关键在于我不能确定比较的数值到底是小数点后多少位。 For Example,设比较的数值为1.0000001和1.0000001,如果 我将精度设为1e-7,那么它们就相等了,但如果设为1e-15;就很可 能不相等,如何是好呢? Please!
N ningliu Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-09 #8 你不是有精度限制么,一般来说取所要误差精度的小一个数量级的就可以了. //问题的关键在于我不能确定比较的数值到底是小数点后多少位。 ^^^^^^^^^^^^^你必须确定你所要的精度误差,xixi. 在理论上要求相等,但现实世界中不可能完全相等,所以我说,你总的根据你的问题 确定一个合理的误差,或者向用户提出也不错呀. 实在不行就弄个很小的数就得了. 要不将你的实际应用说出来,大伙出出主意.
你不是有精度限制么,一般来说取所要误差精度的小一个数量级的就可以了. //问题的关键在于我不能确定比较的数值到底是小数点后多少位。 ^^^^^^^^^^^^^你必须确定你所要的精度误差,xixi. 在理论上要求相等,但现实世界中不可能完全相等,所以我说,你总的根据你的问题 确定一个合理的误差,或者向用户提出也不错呀. 实在不行就弄个很小的数就得了. 要不将你的实际应用说出来,大伙出出主意.
S seagull Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-11 #9 没有别的办法吗?算法中需要判断两点坐标是否重合,由于点的 坐标范围差异较大,如有些是经纬度坐标,精度至少要求1e-10,但设 置这一精度的话,如果点坐标计算出来为1.0000001和1.0000001,以 abs(x1-x2)<1e-10来判断,有时候相等,有些情况就不相等,应该怎 么办呢?都快急死人了。听说C++可以设置实数的精度范围,Delphi 中难道没有吗?
没有别的办法吗?算法中需要判断两点坐标是否重合,由于点的 坐标范围差异较大,如有些是经纬度坐标,精度至少要求1e-10,但设 置这一精度的话,如果点坐标计算出来为1.0000001和1.0000001,以 abs(x1-x2)<1e-10来判断,有时候相等,有些情况就不相等,应该怎 么办呢?都快急死人了。听说C++可以设置实数的精度范围,Delphi 中难道没有吗?
J Jams Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-11 #10 C的精度范围是指有效数字,如Real为小数点后的七位有效数字,Double则更多, 在一定的有效数字范围内,可以采用以上的方法。现在你的坐标计算就是随心所欲 地不固定,你让计算机该如何去做?!
S seagull Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-11 #11 对不起,我不大清楚有效数字是什么意思,我只是希望如果 计算结果为0.001时,它可以在小数点后面十位再有变化嘛,如 果是0。001000000011111都没有关系的,但不应该是0.00100001 或0.0099999999这样的东西呀,计算机为什么连这也做不到呢? 真是笨死了!
对不起,我不大清楚有效数字是什么意思,我只是希望如果 计算结果为0.001时,它可以在小数点后面十位再有变化嘛,如 果是0。001000000011111都没有关系的,但不应该是0.00100001 或0.0099999999这样的东西呀,计算机为什么连这也做不到呢? 真是笨死了!
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-11 #12 计算机本来就没有生命, 当然笨. 它只会执行人的指令. 当初设计浮点数时就是这么定的. 谁叫你不指定精度呢?
S seagull Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-11 #13 搞错没有,我前面说过了嘛,要求精度在1e10呀, 怎么说没有精度呢?奇怪!我记得你挺厉害的,你也不 知道吗?拜托,是不是真的没有办法,如果是的话,我 只好死心了。
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-11 #14 还是没明白您具体的要求. 任何一种浮点数的精度都超过您的要求了. 所以您要进行一下转换, 将原计算结果的精度调整到您 需要的精度, 再进行比较. 最简单的是转成字符串比较. if formatfloat('0.0000000000', f1)=formatfloat('0.0000000000',f2) then ....
还是没明白您具体的要求. 任何一种浮点数的精度都超过您的要求了. 所以您要进行一下转换, 将原计算结果的精度调整到您 需要的精度, 再进行比较. 最简单的是转成字符串比较. if formatfloat('0.0000000000', f1)=formatfloat('0.0000000000',f2) then ....
S seagull Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-13 #15 抱歉,现在才能看到。不过不是你的意思啦,我的意思是我已经取精度为 1e-10,这样判断起来大部分数值都没有问题,可有时候两个数字明明相等的, 但其相减后值大于1e-10,这样结果就是两数字不等,我的程序就出错了嘛。 有什么好办法吗?
抱歉,现在才能看到。不过不是你的意思啦,我的意思是我已经取精度为 1e-10,这样判断起来大部分数值都没有问题,可有时候两个数字明明相等的, 但其相减后值大于1e-10,这样结果就是两数字不等,我的程序就出错了嘛。 有什么好办法吗?
C cytown Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-14 #17 这样, 判断是否相等时: if int(f1*100000000)=int(f2*100000000) then .... 试试.
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 1999-09-14 #19 不会成功. 计算机是二进制的, 你乘的不是2的整次方一样会造成误差(可能更大). 你在1e-10时 得到两个数不相等,那就说明在这个精度下两个数本来就不相等的. 要得到相等的结果只有减小精度, 或者在中间结果时就调整精度再继续下一步运算.
不会成功. 计算机是二进制的, 你乘的不是2的整次方一样会造成误差(可能更大). 你在1e-10时 得到两个数不相等,那就说明在这个精度下两个数本来就不相等的. 要得到相等的结果只有减小精度, 或者在中间结果时就调整精度再继续下一步运算.