【问题标题】:Check a float variable for existence检查浮点变量是否存在
【发布时间】:2010-07-26 04:49:44
【问题描述】:

我必须检查一个浮点变量以确定特定变量的存在。理想情况下,它应该是一个 bool 值或至少一个 int。由于接口约束和遗留代码,我无法将数据类型更改为 bool。所以如果我要进行检查,我可以直接按照下面的示例代码进行检查吗:

    void check(float f)
    {
        if (!f)
            printf ("Zero val!\n");
        else
            printf ("Value exists!\n");
    }

考虑到值是如何存储在浮点变量中的,这会是万无一失的还是有更好的方法来做到这一点。将其转换为空头并检查是不可行的,因为: 如果值为“1”,则存储为 0.9999998;将其转换为短路会导致错误的“0”。

P.S 代码恰好出现在 Objective C 文件中,但是是 C 格式。

【问题讨论】:

  • 这里有一个提示:0 仍然是一个浮点值。 :)
  • 这个问题骗了我!!感谢罗伯特的提示。

标签: c objective-c


【解决方案1】:

您所拥有的将起作用,但需要注意的是,它会将正零和负零都检测为零值。这对您的目的可能很重要,也可能无关紧要。如果您在没有默认 IEEE-754 行为的平台上运行(如许多嵌入式平台),则非规范化也可能通过 !f 检查,具体取决于您的编译器如何处理它。这对您来说可能不是问题,但需要注意。

如果您将来必须做这种事情,最好使用“不是数字”来表示未初始化的浮点数据,然后您可以使用(f != f)isnan(f) 进行检查。

【讨论】:

  • 只是好奇。浮点值 (1) 是否有可能在不涉及任何计算(如除法)的情况下存储为 0.99999 或 1.00001?
  • 没有。 1 完全可以用任何形式表示,并且永远只是 1。但是,1.1 不能用浮点表示。
  • @voidone:R.. 说的是对的;值 1.0 可以用所有标准浮点格式表示,并且不会因为这些格式之间或整数格式之间的转换而被舍入。
猜你喜欢
  • 2014-09-08
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2014-06-23
  • 2017-08-05
  • 2010-10-25
相关资源
最近更新 更多