我有一些C#代码,我正在转换为Objective-C。在C#中我会调用Math.Log()。我正在慢慢地了解到有些人坚持使用C函数/类型,只有在需要与Cocoa互操作时才使用NSNumber等。
是否有等效的ObjC / Cocoa,或者我是否需要进入C来执行此操作?我需要我的代码尽可能准确,因为它是计算器的一部分。
如果有任何不同,此代码需要在iPhone上运行。
答案 0 :(得分:5)
NSNumber
对于NSArray
或NSDictionary
或核心数据存储中的存储非常有用。
您不希望将NSNumber
用于算术,仅当您需要在某处存储该数字时才使用基础或核心数据类。
这是因为在执行算术运算时,您必须经常在NSNumber
和原始类型(如int
,double
,long
等之间进行转换。使用基本类型的操作达到所需的准确度,然后创建NSNumber
实例,如果您确实需要它。
尽管如此,在任何Cocoa / Cocoa Touch应用程序中使用C数学库都是相当简单的:
#import <math.h>
...
double _param = 7.389;
NSNumber *_result = [NSNumber numberWithDouble:log(_param)];
这是NSDecimalNumber
的同一故事,NSNumber
是{{1}}的子类:
You might consider the C interface if you don’t need to treat decimal numbers as objects - 也就是说,如果您不需要将它们存储在面向对象的集合中,例如NSArray或NSDictionary的实例。如果您需要最高效率,也可以考虑C接口。 C接口比NSDecimalNumber类更快,占用的内存更少。
答案 1 :(得分:2)
要么使用C的log()
函数,在将十进制数转换为二进制数时会牺牲一些精度。或者你找一个十进制数字库。 Cocoadev has some suggestions,尤其是bc
实用程序和GNU Multiple Precision Arithmetic Library库。
答案 2 :(得分:0)
log()
函数系列是您最好的选择。可用的手册页here。