gpt4 book ai didi

objective-c - NSNumber 计算和精度?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:40 29 4
gpt4 key购买 nike

两个简单的问题,如果可以的话,我应该如何获取两个 NSNumber 对象,执行计算并最终得到一个也是 NSNumber 的结果?

NSNumber *flux = [[NSNumber alloc] initWithDouble:100.0];
NSNumber *mass = [[NSNumber alloc] initWithDouble:3];

double intermediate = [flux doubleValue] / [mass doubleValue];
NSLog(@"INTER : %.20f", intermediate);

NSNumber *result = [[NSNumber alloc] initWithDouble:intermediate];
NSLog(@"RESULT: %@", result);

...
...

[flux release];
[mass release];
[result release];

同时查看来自 NSLog 的控制台中的结果,是否有任何精度损失?我假设没有,我看到的只是显示精度,但只是好奇?

INTER : 33.33333333333333570181
RESULT: 33.33333333333334

加里

最佳答案

(与您的问题无关但相关)

NSNumber 不是用来做以 10 为基数的数学运算的。它主要用于包装和存储数值。如果你需要做真正的数学,你想使用 NSDecimal.

NSDecimalNumber, an immutable subclass of NSNumber, provides an object-oriented wrapper for doing base-10 arithmetic. An instance can represent any number that can be expressed as mantissa x 10^exponent where mantissa is a decimal integer up to 38 digits long, and exponent is an integer from –128 through 127

尽管我们称它们为“计算机”,但我们的逻辑引擎无法进行实际数学运算,因此它们不得不伪造它。当你到达非常大或非常小的数量级的极端时,这种伪造就会开始显现。这就是为什么您需要自定义数字类,这些类可以包含比一串数字更多的信息。

因此,如果您对精度有任何顾虑,请使用 NSDecimal 而不是 NSNumber。 NSDecimal 旨在执行精确计算。

编辑01:

... how I should go about taking two NSNumber objects, performing a calculation and ending up with a result that is also an NSNumber?

严格来说,您不应该使用 NSNumber 进行计算。你会注意到 NSNumber 没有专门的数学方法。您必须转换为标量,然后再转换回对象。这会导致精度损失,并且精度会根据硬件或标量的定义而改变。

相比之下,NSDecimal 可以精确地表示非常精确的数字,因为它抽象地保存了它们。它具有执行精确数学运算的专用方法。

Also looking at the results in console from NSLog, is there any loss of precision?

是的,除了格式化之外,还有数学精度的损失。标量根据它们存储的数字的类型和大小而具有不同的精度。在很大的数量级上,这会导致精度问题。如果你混合类型,比如说 NSInteger 和 NSUInteger,你会得到 NSInteger 的最大精度。

您还会遇到所有 old problems of using scalars.

If you ask an NSNumber object for its value using a type that cannot hold the value, you get back an erroneous result—for example, if you ask for the float value of a number created with a double that is greater than FLT_MAX, or the integer value of a number created with a float that is greater than the maximum value of NSInteger.

NSDecimal 将您从所有这些可能的错误来源中解放出来。它进行精确的数学计算,其数量级远远超出任何人在现实世界中使用的数量级。

我再说一遍:如果精度是一个问题,不要使用 NSNumber 或标量。

关于objective-c - NSNumber 计算和精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2333755/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com