Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 浮动对双_Java_C_Floating Point - Fatal编程技术网

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)小于某个阈值,你们可以认为等式成立。根据应用程序的要求,这些阈值可以是绝对的,也可以是相对的。有一些很好的解决办法。我希望它能有所帮助

只要您在比较中没有混合提升浮点数和本机计算的双倍点数,您应该可以,但请注意:

比较浮点(或双精度)是否相等很困难

以下是一些亮点:

  • 由于浮点格式的精度有限,因此无法使用
    =

  • 浮动(0.1)和双精度(0.1)分别是不同的值(0.100000001490119384765625和0.10000000000000055551151231257827021181583404541015625)。在您的情况下,这意味着比较两个浮点数(通过转换为double)可能是可以的,但是如果要比较浮点数和double,请小心

  • 通常使用ε或较小的值与进行相对比较(如果
    a-b
    ,则浮点数a和b被视为相等)。在C中,float.h定义FLT_EPSILON就是为了这个目的。但是,如果
    a
    b
    都非常小,或者都非常大,这种比较就不起作用

  • 您可以通过使用a和bε的缩放相对大小来解决这一问题,但在某些情况下会出现故障(如与零的比较)

  • 您可以比较浮点数的大小,找出它们之间有多少个可表示的浮点数。这就是Java的功能。这称为ULP差异,表示“最后位置的单位”差异。它通常是好的,但与零相比也会出现故障

  • 文章的结论是:

    知道你在做什么

    没有银弹。你必须明智地选择

    • 如果您将其与零进行比较,那么基于相对ε和ULPs的比较通常是没有意义的。您需要使用一个绝对ε,它的值可能是FLT_ε和计算输入的一些小倍数。也许吧
    • 如果您要与非零数字进行比较,那么基于相对ε或ULPs的比较可能就是您想要的。您可能需要相对ε的一些小倍数FLT_ε,或者一些小数量的ULP。如果你确切地知道你所比较的数字,就可以使用绝对ε
    • 如果你比较两个任意数字,可以是零或非零,那么你需要厨房水槽。祝你好运,万事如意
    所以,要回答你的问题:

    • 如果将
      double
      s降级为
      float
      s,则可能会失去精度,并错误地将两个不同的
      double
      s报告为相等(如前所述)
    • 如果要将相同的
      浮点
      s升级为
      双精度
      ,则增加的精度不会有问题,除非将
      浮点
      双精度
      (假设浮点值为1.234,精度只有4位小数,那么双精度1.2345可能表示与浮点值相同的值。在这种情况下,您最好以
      浮点值的精度进行比较,或者更一般地说,以比较中最不准确的表示的错误级别进行比较)
    • 如果你知道你要比较的数字,你可以按照上面引用的建议去做
    • 如果你在比较任意数字(可能是零或非零),没有办法在所有情况下都正确比较它们——选择一个比较并了解其局限性
    一些实际考虑事项(因为这听起来像是一项作业):

    • most提到的ε比较可能很好(但包括对极限的讨论)
      result = a * b / c;
      result = (a * b) / c;
      result = a * (b / c);