NSNumber和NSDecimalNumber的自然对数方法

时间:2009-10-27 17:52:28

标签: iphone objective-c cocoa math

我有一些C#代码,我正在转换为Objective-C。在C#中我会调用Math.Log()。我正在慢慢地了解到有些人坚持使用C函数/类型,只有在需要与Cocoa互操作时才使用NSNumber等。

是否有等效的ObjC / Cocoa,或者我是否需要进入C来执行此操作?我需要我的代码尽可能准确,因为它是计算器的一部分。

如果有任何不同,此代码需要在iPhone上运行。

3 个答案:

答案 0 :(得分:5)

NSNumber对于NSArrayNSDictionary或核心数据存储中的存储非常有用。

您不希望将NSNumber用于算术,仅当您需要在某处存储该数字时才使用基础或核心数据类。

这是因为在执行算术运算时,您必须经常在NSNumber和原始类型(如intdoublelong等之间进行转换。使用基本类型的操作达到所需的准确度,然后创建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