首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MAX_FLOAT与浮点行为的不一致性

MAX_FLOAT与浮点行为的不一致性
EN

Stack Overflow用户
提问于 2015-11-30 23:25:18
回答 1查看 383关注 0票数 1

在iOS上,我尝试将数字1448924191存储为NSNumber,然后用floatValue检索它:

代码语言:javascript
复制
    double max_float = MAXFLOAT; // really big num (3.4028234663852886E+38)
    double someEpoch = 1448924191;
    NSNumber *epochNum = [NSNumber numberWithDouble:someEpoch]; //

但是,当我要求返回浮点数时,返回值被舍入到最近的60单位间隔:

代码语言:javascript
复制
        float asFloat = [epochNum floatValue];    // 1448924160 - rounded to 60???
        double asDouble = [epochNum doubleValue]; // 1448924191 - correct

使用doubleValue解决了这个问题,但为什么呢?浮动不应该能够处理这个数字,因为它远小于FLOAT_MAX?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 01:01:51

正如在关于你的问题的评论中提到的,这是浮点数的一个基本限制。float on iOS是一个32位浮点数.其中一些位用于存储指数,因此可以存储的有效位数大大少于int中的数字数。

如果您使用#import <float.h>,您将访问许多宏,这些宏将告诉您浮点格式的详细信息,包括:

FLT_DIG 这是浮动数据类型的精度小数位数。从技术上讲,如果p和b分别是表示的精度和基数,那么十进制精度q是十进制数字的最大数目,这样任何带有q基10位数的浮点数都可以舍入到带有p基b位的浮点数,然后再返回,而不改变q小数。

这或多或少是指可以从int转换为float的最大数字中的数字数,而不会丢失任何精度。这实际上是一个保守的估计-你可以计算你可以存储在一个浮点中的绝对最大整数,通过对标题中的其他宏进行一些计算,尽管我怀疑这是你想要做的事情。

谈到从int到float的转换,您还应该注意到,在示例中的这一行代码中:

代码语言:javascript
复制
double someEpoch = 1448924191;

您正在隐式地将整数1448924191转换为双表示形式。这很好,因为1448924191完全可以表示为双和int。如果使该值大于将适合于长int的值,则可能会出现奇怪的行为,因为常量将被存储为无符号的long,然后转换为double。当出现此错误时,编译器至少会警告您。

如果您想要一个双常数,您应该确保在值中包含一个小数点:

代码语言:javascript
复制
double someEpoch = 1448924191.0;

如果你要立即将它赋值给一个双变量,这就不那么重要了,但是如果你定义了一个浮动常量,那么添加小数点是很有用的,以确保它在任何地方都被当作浮点值对待。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34009884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档