Iphone 来自除法的意外值

Iphone 来自除法的意外值,iphone,objective-c,ios4,Iphone,Objective C,Ios4,我从以下代码中获得一些意外值: - (void) test { int target = 0; int received = 0; float result = (float)received/target; NSLog(@"%.0f",result); } 在控制台中,它打印“nan”。目标值和接收值可能会更改。但当两者都为0时,将创建问题。我想在标签上显示结果的值,但它打印的是nan而不是浮点值 代码中有什么错误 感谢…您被零除,这通常是一种非法的算术运算,在这种情况下,将在FPU

我从以下代码中获得一些意外值:

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

float result = (float)received/target;

NSLog(@"%.0f",result);
}
在控制台中,它打印“nan”。目标值和接收值可能会更改。但当两者都为0时,将创建问题。我想在标签上显示结果的值,但它打印的是nan而不是浮点值

代码中有什么错误


感谢…

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

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

要捕获Nan,可以包含math.h并使用函数isnan()决定继续执行错误处理或常规流


除零通常是非法的算术运算,在这种情况下会在FPU中产生异常(由于IEEE 754在微处理器中处理浮点运算),结果将为NaN,表示“不是数字”

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

要捕获Nan,可以包含math.h并使用函数isnan()决定继续执行错误处理或常规流


如果按零偏差,则编程语言的结果称为未定义,在数学中称为无穷大。请参见,和..和nan NotNumber..

如果按零偏差,则编程语言的结果称为未定义,在数学中称为无穷大。请参见,和..和nan NotANumber..

您可以使用该方法捕获值

isnan()

它接受一个double并返回一个bool。您可以这样修改代码以使其正常工作:

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

    float result = (float)received/target;

    if (isnan(result))
    {
        result = 0;
    }
    NSLog(@"%.0f",result);
}

您可以使用该方法捕获值

isnan()

它接受一个double并返回一个bool。您可以这样修改代码以使其正常工作:

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

    float result = (float)received/target;

    if (isnan(result))
    {
        result = 0;
    }
    NSLog(@"%.0f",result);
}

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


正浮点数除以零得到正无穷大。负红利返回负无穷大。

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


正浮点数除以零得到正无穷大。负红利返回负无穷大。

这里还有一个注意事项,其他答案中还没有提到

那条线

float result = (float)received/target;
…首先将received强制转换为(float),然后除以整数值目标。我不知道你们其他人的情况,但我不知道编译器如何处理这个问题。我得查一下

另一方面,我知道当你把一个int除以一个int,或者把一个float除以一个float。。。不查一下

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

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

其他答案中还没有提到的另一个注意事项

那条线

float result = (float)received/target;
…首先将received强制转换为(float),然后除以整数值目标。我不知道你们其他人的情况,但我不知道编译器如何处理这个问题。我得查一下

另一方面,我知道当你把一个int除以一个int,或者把一个float除以一个float。。。不查一下

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

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

正如其他答案提到的,这是被0除的结果,但它可以被捕获和处理。类似的问题请参见此处。您还可以检查
target
是否为0,在这种情况下甚至不尝试除法。正如其他答案所述,这是0除法的结果,但可以捕获并处理。类似的问题请参见此处。您还可以检查
target
是否为0,在这种情况下甚至不尝试除法。除法不是非法操作,但在IEEE 754中有明确定义的结果。@Nikolai:非法操作,因此例外?将此行为定义为异常是为了确保进程不会崩溃或恶化,这并不能使其合法化。IEEE没有定义默认情况下是否打开或关闭浮点异常。它甚至没有定义控制行为的接口。在Mac OS X(和许多其他平台)上,浮点异常将由SIGFPE提供,但默认情况下会被屏蔽。而且,b.t.w.即使可能存在异常,该操作仍然会有一个定义良好的结果。所以,是的,这里没有非法操作。另一个错误的语句:编译器/运行时不会将结果生成NaN,而是浮点处理器。除零不是非法操作,但在IEEE 754中有明确定义的结果。@Nikolai:非法操作,因此出现异常?将此行为定义为异常是为了确保进程不会崩溃或恶化,这并不能使其合法化。IEEE没有定义默认情况下是否打开或关闭浮点异常。它甚至没有定义控制行为的接口。在Mac OS X(和许多其他平台)上,浮点异常将由SIGFPE提供,但默认情况下会被屏蔽。而且,b.t.w.即使可能存在异常,该操作仍然会有一个定义良好的结果。所以,是的,这里没有非法操作。另一个错误的说法:公司