分裂的意外价值

时间:2011-04-29 06:29:12

标签: iphone objective-c ios4

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

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

float result = (float)received/target;

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

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

代码有什么问题?

...谢谢

5 个答案:

答案 0 :(得分:6)

IEEE 754定义0.0 / 0.0的结果是(无声)NaN。

正浮点数除以零会产生正无穷大。负股息会带来负无穷大。

答案 1 :(得分:3)

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

变量'target'必须有一个从零开始的值,否则除法将永远不会被执行。在过去,零除以是让流程崩溃的可靠方法。

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

答案 2 :(得分:2)

您可以使用方法

捕获值

isnan()

它需要一个双倍并返回一个bool。您可以像这样修改您的代码:

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

    float result = (float)received/target;

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

答案 3 :(得分:0)

如果除以零,结果对于编程语言来说是未定义的,在数学中它被称为无穷大。参见thisthisthis ..和nan { {3}} Notanumber ..

答案 4 :(得分:0)

此处还有另一个注释,其他答案中尚未提及。

线......

float result = (float)received/target;

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

另一方面,我确实知道编译器在用int划分int时要做什么,或者用浮点数划分浮点数...而不查找它。

因此。为了您未来的代码读者,我鼓励您将您的代码行重新声明为int-by-int或float-by-float除法。如果你的意思是浮动浮动,那么这样的一行将更容易让未来的读者理解:

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