【问题标题】:unexpected values from division来自除法的意外值
【发布时间】:2011-08-15 06:44:51
【问题描述】:

我从以下代码中得到了一些意想不到的价值:

- (void) test
{
int target = 0;  
int received = 0;

float result = (float)received/target;

NSLog(@"%.0f",result);
}

在控制台中打印“nan”。目标值和接收值可能会发生变化。但是当两者都为 0 时,就会创建问题。我想在标签上显示结果的值,但它打印的是 nan 而不是 float 值。

代码有什么问题?

谢谢...

【问题讨论】:

  • 意外值?你期望什么值? ;-)

标签: iphone objective-c ios4


【解决方案1】:

除以零,这通常是非法的算术运算,在这种情况下会在 FPU 中产生异常(由于 IEEE 754,它在微处理器中处理浮点算术),结果将为 NaN,这意味着“不一个数字'。

变量“目标”必须有一个与零分开的值,否则除法将永远不会正确执行。在过去,除以零是导致进程崩溃的可靠方法。

要捕获 Nan,您可以包含 math.h 并使用函数 isnan() 来决定继续进行错误处理还是常规流程。

【讨论】:

  • 除以零不是非法操作,但在 IEEE 754 中有明确定义的结果。
  • @Nikolai:非法操作,所以例外?将此行为定义为异常是为了确保进程不会崩溃或以其他方式恶化,它不会使其合法。
  • IEEE 没有定义浮点异常是默认打开还是关闭。它甚至没有定义控制行为的接口。在 Mac OS X(和许多其他平台)上,浮点异常将由 SIGFPE 提供,但默认情况下会被屏蔽。而且,顺便说一句。即使可能存在异常,该操作仍然会有明确定义的结果。所以,是的,这里没有非法操作
  • 另一个错误的说法:编译器/运行时不会将结果生成为 NaN,而是生成浮点处理器。
【解决方案2】:

此处还有其他答案中尚未提及的其他注释。

线...

float result = (float)received/target;

...首先将接收到的转换为 (float),然后除以整数值目标。我不知道你们其他人的情况,但我不知道编译器对此做了什么。我得查一下。

另一方面,我确实知道当您将一个 int 除以一个 int 或将一个浮点除以一个浮点时,编译器会做什么......而无需查找它。

所以。为了您的代码的未来读者,我鼓励您将您的代码行重新声明为 int-by-int 或 float-by-float 除法。如果您的意思是逐个浮点数,那么这样的一行代码对于未来的读者来说会更容易理解:

float result = (float) received / (float) target;

【讨论】:

    【解决方案3】:

    IEEE 754 定义 0.0 / 0.0 的结果是(静默)NaN。

    正浮点数除以零产生正无穷大。负股息返回负无穷大。

    【讨论】:

      【解决方案4】:

      你可以用方法捕获值

      isnan()

      它需要一个双精度并返回一个布尔值。你可以像这样修改你的代码来工作:

      - (void) test
      {
          int target = 0;  
          int received = 0;
      
          float result = (float)received/target;
      
          if (isnan(result))
          {
              result = 0;
          }
          NSLog(@"%.0f",result);
      }
      

      【讨论】:

      【解决方案5】:

      如果你除以零,则据说结果对于编程语言来说是未定义的,在数学上它被称为无穷大。请参阅thisthisthis..还有 nan meansNotANumber..

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 2014-06-21
        • 2020-12-05
        • 1970-01-01
        相关资源
        最近更新 更多