我从以下代码中获得了一些意想不到的价值:
- (void) test
{
int target = 0;
int received = 0;
float result = (float)received/target;
NSLog(@"%.0f",result);
}
在控制台中打印“nan”。目标和接收的值可能会更改。但是当两者都是0而不是创建问题。我想在标签上显示结果的值,但它打印的是nan而不是float值。
代码有什么问题?
...谢谢
答案 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)
答案 4 :(得分:0)
此处还有另一个注释,其他答案中尚未提及。
线......
float result = (float)received/target;
...首先将接收转换为(浮点),然后除以整数值目标。我不知道你们其他人在那里,但我不知道编译器对此做了什么。我得查一查。
另一方面,我确实知道编译器在用int划分int时要做什么,或者用浮点数划分浮点数...而不查找它。
因此。为了您未来的代码读者,我鼓励您将您的代码行重新声明为int-by-int或float-by-float除法。如果你的意思是浮动浮动,那么这样的一行将更容易让未来的读者理解:
float result = (float) received / (float) target;