有没有这样一种情况,两个浮点值之间的比较(equals())会返回false,如果你将它们作为DOUBLE进行比较,而如果你将它们作为FLOAT进行比较,则会返回true?
我正在编写一些过程,作为我的小组项目的一部分,用来比较任意给定类型的两个数值。我总共需要处理4种类型:double、float、int和long。因此,我想将double和float组合成一个函数,也就是说,我只是将任何float转换为double,然后进行比较。
这会导致任何不正确的结果吗?
谢谢。
发布于 2012-04-10 12:22:18
如果您正在将双精度数转换为浮点数,并且它们之间的差异超出了浮点数类型的精度,那么您可能会遇到麻烦。
例如,假设您有两个双精度值:
9.876543210
9.876543211浮点数的精度只有六位小数。这意味着两个float值都是9.87654,因此是相等的,即使这两个double值本身并不相等。
但是,如果您正在讨论将浮点数转换为双精度,那么相同的浮点数应该会给出相同的双精度值。如果浮点数不同,额外的精度将确保双精度也是不同的。
发布于 2012-04-10 13:54:40
只要你没有在比较中混合使用提升的浮点数和本地计算的双精度数,你应该是可以的,但要小心:
比较浮点数(或双精度数)是否相等很困难- see this lengthy but excellent discussion。
以下是一些亮点:
==,因为浮点格式的精度有限的问题a - b < epsilon,则认为浮点数a和b相等)。在C语言中,float.h为这个目的定义了FLT_EPSILON。但是,在a和b都很小或都很大的情况下,这种类型的比较不起作用。,
Float.equals()所做的。这就是所谓的ULP差,即“最后一位的单位”差。它总体上是好的,但在与零比较时也会崩溃。文章的结论是:
知道你在做什么
没有什么灵丹妙药。你必须做出明智的选择。
所以,为了回答你的问题:
doubles降级为floats,则可能会失去精度,并错误地将两个不同的double报告为相等(如paxdiablo所指出的)。floats升级到<float>D51,则增加的精度不会成为问题,除非您将float与double进行比较(假设您的浮点数为1.234,而精度只有4位小数位),则双精度1.2345可能表示与浮点数相同的值。在这种情况下,最好是按照comparison).float中最不准确的表示的错误级别进行比较,您可以遵循上面引用的建议。几个实际的考虑因素(因为这听起来像是一个任务):
doubles。发布于 2012-04-10 12:20:44
我完全不明白你为什么要这么做。==运算符已经迎合了两端所有可能的类型,在相关语言标准中已经指定了关于类型强制和扩大的广泛规则。你所要做的就是使用它。
https://stackoverflow.com/questions/10083039
复制相似问题