首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点vs双精度

问浮点vs双精度
EN

Stack Overflow用户
提问于 2012-04-10 12:16:16
回答 7查看 24.2K关注 0票数 9

有没有这样一种情况,两个浮点值之间的比较(equals())会返回false,如果你将它们作为DOUBLE进行比较,而如果你将它们作为FLOAT进行比较,则会返回true?

我正在编写一些过程,作为我的小组项目的一部分,用来比较任意给定类型的两个数值。我总共需要处理4种类型:double、float、int和long。因此,我想将double和float组合成一个函数,也就是说,我只是将任何float转换为double,然后进行比较。

这会导致任何不正确的结果吗?

谢谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-04-10 12:22:18

如果您正在将双精度数转换为浮点数,并且它们之间的差异超出了浮点数类型的精度,那么您可能会遇到麻烦。

例如,假设您有两个双精度值:

代码语言:javascript
复制
9.876543210
9.876543211

浮点数的精度只有六位小数。这意味着两个float值都是9.87654,因此是相等的,即使这两个double值本身并不相等。

但是,如果您正在讨论将浮点数转换为双精度,那么相同的浮点数应该会给出相同的双精度值。如果浮点数不同,额外的精度将确保双精度也是不同的。

票数 15
EN

Stack Overflow用户

发布于 2012-04-10 13:54:40

只要你没有在比较中混合使用提升的浮点数和本地计算的双精度数,你应该是可以的,但要小心:

比较浮点数(或双精度数)是否相等很困难- see this lengthy but excellent discussion。

以下是一些亮点:

  1. 您不能使用==,因为浮点格式的精度有限的问题

  1. float(0.1)和double(0.1)是不同的值(分别为0.100000001490116119384765625和0.1000000000000000055511151231257827021181583404541015625) )。在您的例子中,这意味着比较两个浮点数(通过转换为双精度)可能是可以的,但如果您想要比较浮点数和双精度数,则要小心。

  1. 通常使用epsilon或较小的值与进行相对比较(如果为a - b < epsilon,则认为浮点数a和b相等)。在C语言中,float.h为这个目的定义了FLT_EPSILON。但是,在a和b都很小或都很大的情况下,这种类型的比较不起作用。

  1. 您可以通过使用缩放相对a和b的大小epsilon来解决这个问题,但这在某些情况下会失效(比如与零进行比较)。

,

  1. ,你可以比较浮点数的integer representations,找出它们之间有多少个可表示的浮点数。这就是Java的Float.equals()所做的。这就是所谓的ULP差,即“最后一位的单位”差。它总体上是好的,但在与零比较时也会崩溃。

文章的结论是:

知道你在做什么

没有什么灵丹妙药。你必须做出明智的选择。

  • 如果要与零进行比较,则基于相对ε和ULP的比较通常是无意义的。您将需要使用绝对epsilon,它的值可能是FLT_EPSILON和计算输入的某个小倍数。
  • 如果你要比较一个非零数,那么基于相对epsilon或ULP的比较可能是你想要的。对于您的相对epsilon,您可能需要一些较小的FLT_EPSILON倍数,或者需要一些较小数量的ULP。如果你确切地知道你要比较的是哪个数字,就可以使用绝对epsilon。
  • 如果你要比较两个可以是零或非零的任意数字,那么你需要厨房水槽。祝你好运,祝你好运。

所以,为了回答你的问题:

  • 如果您将doubles降级为floats,则可能会失去精度,并错误地将两个不同的double报告为相等(如paxdiablo所指出的)。
  • 如果您将相同的floats升级到<float>D51,则增加的精度不会成为问题,除非您将float与double进行比较(假设您的浮点数为1.234,而精度只有4位小数位),则双精度1.2345可能表示与浮点数相同的值。在这种情况下,最好是按照comparison).
  • If的精度进行比较,或者更一般地说,在知道要比较的数字的float中最不准确的表示的错误级别进行比较,您可以遵循上面引用的建议。
  • 如果您正在比较任意数字(可以是零或非零),则无法在所有情况下正确地比较它们-选择一个比较并知道其limitations.

几个实际的考虑因素(因为这听起来像是一个任务):

  • ,most提到的epsilon比较可能没问题(但在文章中包括对限制的讨论)。如果你打算比较双精度浮点数和浮点数,试着在浮点型中比较,但是如果不是,试着用双精度比较。更好的是,在任何地方都可以使用doubles。

  • 如果你想在作业中打出王牌,在比较浮点数时写下问题,以及选择任何特定比较方法的理由。
票数 9
EN

Stack Overflow用户

发布于 2012-04-10 12:20:44

我完全不明白你为什么要这么做。==运算符已经迎合了两端所有可能的类型,在相关语言标准中已经指定了关于类型强制和扩大的广泛规则。你所要做的就是使用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10083039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档