2019-05-14 11:18:17 blackbigdragon 阅读数 379

对于只有两个有效的double是可以直接判==的而不用搞什么相减和一个极小数相比

也就是说两个double之间,>、<、==、!=,<=,>=都是可以直接用的。

 

但如果(两组中)每组包括3、4个double类型,进行运算后(比较加减乘除运算后),得出的两个double数进行比较, 除了可以采用与极小数比较,还可以

用NSDecimalNumber这个类来处理浮点数,

 

//浮点数转化成NSDecimalNumber

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithFloat:浮点数];

 

 //两个数想乘

    NSDecimalNumber *decimalNumber3 = [decimalNumber1 decimalNumberByMultiplyingBy:decimalNumber2];

 

 //最终两个浮点数比较大小变成NSDecimalNumber比较大小(如果有需求还可以加减乘除四则运算)

    NSComparisonResult result_clearrate_float = [decimalNumber3 compare:decimalNumber3];

 

   //NSComparisonResult 的结果分为

     NSOrderedAscending  升序

     NSOrderedSame       相等

     NSOrderedDescending 降序

2014-02-23 16:55:53 u010477563 阅读数 1563
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568)<DBL_EPSILON)

#define IOS7 [[UIDevice currentDevice].systemVersion floatValue] >= 7.0
#define screenWidth     [UIScreen mainScreen].bounds.size.width
#define screenHeight    [UIScreen mainScreen].bounds.size.height



2020-01-13 10:24:08 liuyanqinmn 阅读数 5

//获取当前设备可用内存(单位:MB)

-(double)availableMemory{

    vm_statistics_data_t vmStats;

    mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;

    kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);

    if (kernReturn != KERN_SUCCESS) {

        return NSNotFound;

    }

    return ((vm_page_size * vmStats.free_count) / 1024.0)/1024.0;

}

//获取当前任务所占的内存,单位:MB

-(double)usedMemory{

    task_basic_info_data_t taskInfo;

    mach_msg_type_number_t infoCount;

    kern_return_t kernReturn = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&taskInfo, &infoCount);

    if (kernReturn != KERN_SUCCESS) {

        return NSNotFound;

    }

    return (taskInfo.resident_size / 1024.0 / 1024.0);

}

2015-08-31 16:38:42 huangznian 阅读数 1692
转自http://www.cnblogs.com/taoxu0903/archive/2011/03/11/1981389.html

参考:

Comparing floating point numbers  

总结几点:

0. float占4byte,精度是6~7位;double占8byte,精度是15~16位。 


1. 因为double类型或float类型都是有精度的,其实都是取的近似值,所以有个误差。和一个很小的数比如0.00000001(1e-8)比较就是为了在这个误差范围内进行比较。

举个例子如double b = 0.123456可能是0.1234561的四舍五入后得到的结果。最后的0.0000001就表示误差范围了。 
<span style="color: rgb(51, 51, 51);">无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式 。</span>
double 与 0 比较:
doubel a; 
if ( a>-0.000001 && a< 0.000001 )对。 
而 if( a == 0 )不对! 

2. C/C++的浮点数据类型有float和double两种。它们在内存中是以科学计数法的结果来存储的。 

类型float大小为4字节,即32位,内存中的存储方式如下:


 符号位(1 bit)

指数(8 bit)

尾数(23 bit)


类型double大小为8字节,即64位,内存布局如下:


符号位(1 bit)

指数(11 bit)

尾数(52 bit)
  
符号位决定浮点数的正负,0正1负。 
指数和尾数均从浮点数的二进制科学计数形式中获取。

3. 关于比较大小

一般情况下用一个absolute epsilon value来比较(if (fabs(result - expectedResult) < 0.00001))就够了。但是在某些对数字精度有特殊要求的domain,比如graphic,需要用更合理的方法。具体,参见引用文献2.

Comparing for equality

Comparing with epsilon – absolute error

Comparing with epsilon – relative error

iOS清除缓存的方法

阅读数 749

没有更多推荐了,返回首页