Java 浮动对双
是否有过这样的情况:如果将两个浮点值作为Java 浮动对双,java,c,floating-point,Java,C,Floating Point,是否有过这样的情况:如果将两个浮点值作为DOUBLE进行比较(equals()),两个浮点值之间的比较(equals())将返回false,如果将它们作为FLOAT进行比较,则返回true 作为我小组项目的一部分,我正在编写一些程序来比较任意给定类型的两个数值。我总共要处理4种类型:double、float、int和long。因此,我想将double和float组合成一个函数,也就是说,我只需将任何float转换为double,并进行比较 这会导致任何不正确的结果吗 谢谢。我完全不明白你为什么要
DOUBLE
进行比较(equals()
),两个浮点值之间的比较(equals()
)将返回false
,如果将它们作为FLOAT进行比较,则返回true
作为我小组项目的一部分,我正在编写一些程序来比较任意给定类型的两个数值。我总共要处理4种类型:double
、float
、int
和long
。因此,我想将double
和float
组合成一个函数,也就是说,我只需将任何float
转换为double
,并进行比较
这会导致任何不正确的结果吗
谢谢。我完全不明白你为什么要这么做。
=
操作符已经满足了两边所有可能的类型,在类型强制和加宽方面有广泛的规则,这些规则已经在相关的语言标准中指定。你所要做的就是使用它。只要相等测试包含一个增量,你就可以进行该转换
例如:abs((double)floatVal1-(double)floatVal2)<.000001
应该可以工作
根据问题更改进行编辑
不,你不会的。以上仍然有效。如果将双精度转换为浮点,并且它们之间的差异超出浮点类型的精度,则可能会遇到麻烦 例如,假设您有两个双精度值:
9.876543210
9.876543211
浮点数的精度只有六位小数。这意味着两个float
值都是9.87654
,因此相等,即使两个值本身并不相等
然而,如果你说的是将浮点数转换成双打,那么相同的浮点数应该会给你相同的双打点数。如果浮点数不同,额外的精度将确保双精度也不同。对于浮点数f和双精度d之间的比较,您可以计算f和d的差值。若abs(f-d)小于某个阈值,你们可以认为等式成立。根据应用程序的要求,这些阈值可以是绝对的,也可以是相对的。有一些很好的解决办法。我希望它能有所帮助 只要您在比较中没有混合提升浮点数和本机计算的双倍点数,您应该可以,但请注意: 比较浮点(或双精度)是否相等很困难 以下是一些亮点:
=
a-b
,则浮点数a和b被视为相等)。在C中,float.h定义FLT_EPSILON就是为了这个目的。但是,如果a
和b
都非常小,或者都非常大,这种比较就不起作用
- 如果您将其与零进行比较,那么基于相对ε和ULPs的比较通常是没有意义的。您需要使用一个绝对ε,它的值可能是FLT_ε和计算输入的一些小倍数。也许吧
- 如果您要与非零数字进行比较,那么基于相对ε或ULPs的比较可能就是您想要的。您可能需要相对ε的一些小倍数FLT_ε,或者一些小数量的ULP。如果你确切地知道你所比较的数字,就可以使用绝对ε
- 如果你比较两个任意数字,可以是零或非零,那么你需要厨房水槽。祝你好运,万事如意
- 如果将
s降级为double
s,则可能会失去精度,并错误地将两个不同的float
s报告为相等(如前所述)double
- 如果要将相同的
s升级为浮点
,则增加的精度不会有问题,除非将双精度
与浮点
(假设浮点值为1.234,精度只有4位小数,那么双精度1.2345可能表示与浮点值相同的值。在这种情况下,您最好以双精度
浮点值的精度进行比较,或者更一般地说,以比较中最不准确的表示的错误级别进行比较)
- 如果你知道你要比较的数字,你可以按照上面引用的建议去做
- 如果你在比较任意数字(可能是零或非零),没有办法在所有情况下都正确比较它们——选择一个比较并了解其局限性
- most提到的ε比较可能很好(但包括对极限的讨论)
result = a * b / c; result = (a * b) / c; result = a * (b / c);