比较C中的浮点数

nic*_*ame 16 c floating-point comparison zero

我有一个double打印出来0.000000,我试图比较它0.0f,但没有成功.为什么这里有区别?什么是最可靠的方法来确定你的双倍是零?

Ste*_*sop 20

要确定它是否足够接近零,它将打印0.000000到六个小数位,如下所示:

fabs(d) < 0.0000005
Run Code Online (Sandbox Code Playgroud)

但是,处理浮点计算中的小的不准确性通常会变得非常复杂.

如果你想更好地了解你所拥有的价值,请尝试使用%g而不是打印%f.

  • @Steve Mallam:如果`DBL_MIN`是可表示的最小浮点数,那么检查少于那个的目的是什么? (6认同)
  • @Greg:实际上`DBL_MIN`是最小的规范化double值,实现*可以*支持较小的denormed值. (2认同)
  • @Steve Mallam:是的,取决于提问者是如何打印它的,以及他们认为对于他们的目的而言应该算得多的小值.我假设小数点后六位,虽然我没有说明,因此我的代码."DBL_MIN"非常小,但是,根本没有多少计算错误.有时候`DBL_EPSILON`乘以计算中数字的大小是好的.使用`%g`,即使精确的双值"0.0"也不会打印为"0.000000",我认为没有任何值.所以我不知道究竟是什么问题,这是我最好的猜测,`%f`. (2认同)