Objective c 目标C-pow函数混合精度结果
关于objective-c中pow函数的一般问题 为什么会出现以下代码 当基准=125时,ans=4.9999999Objective c 目标C-pow函数混合精度结果,objective-c,floating-point,precision,pow,libm,Objective C,Floating Point,Precision,Pow,Libm,关于objective-c中pow函数的一般问题 为什么会出现以下代码 当基准=125时,ans=4.9999999 NSDecimalNumber * base = [[NSDecimalNumber alloc ]initWithString:@"125"]; NSDecimalNumber * root = [[NSDecimalNumber alloc] initWithString:@"3"]; double ans=pow(125, 1.0/[root doubleValue]);
NSDecimalNumber * base = [[NSDecimalNumber alloc ]initWithString:@"125"];
NSDecimalNumber * root = [[NSDecimalNumber alloc] initWithString:@"3"];
double ans=pow(125, 1.0/[root doubleValue]);
当基数=27时正好是3
NSDecimalNumber * base = [[NSDecimalNumber alloc ]initWithString:@"27"];
NSDecimalNumber * root = [[NSDecimalNumber alloc] initWithString:@"3"];
double ans=pow(125, 1.0/[root doubleValue]);
这里有几个因素在起作用。最重要的是,
1.0/3.0
不是精确的三分之一,因此您正在计算base
的立方根。相反,您指定的计算是:
base**0.333333333333333314829616256247390992939472198486328125
或
当base
为125
时,此计算的精确实数结果为:
4.999999999999999553291243227753830961690873860134487744...
与该值最接近的两个可表示双精度值是5.0
和:
4.99999999999999911182158029987476766109466552734375
后一个值与数学上精确的结果非常接近,因此pow
函数返回了可能的最佳(或“正确四舍五入”)答案
当您在base
等于27的情况下进行相同的计算时,数学上精确的实数结果为:
2.99999999999999981704430129767885583952101310176125736...
在这种情况下,这个数字比任何其他可表示的双精度稍接近3.0
,因此pow
再次返回了可能的最佳结果
因此,在这些情况下,pow
函数将为您提示的计算提供最准确的结果。这就是说,pow
不能保证对所有可能的输入都这样做(事实上,通常不会)。对于所有输入,您不会得到如此精确的结果,对于某些平台上的许多输入,您会得到明显不精确的结果。通常,您不应该依赖于pow
函数的最后一位舍入,也不应该依赖于任何未明确定义以产生正确舍入结果的函数的最后一位舍入
简而言之:你得到的结果是最好的结果,而在其他一些平台上你就不会这么幸运了
备选方案:
- 如果事先知道结果应该是整数,可以通过
或round
函数将其四舍五入到最接近的整数rint
- 如果事先知道结果应该是整数,可以通过
或round
函数将其四舍五入到最接近的整数rint
- 这里有几个因素在起作用。最重要的是,
1.0/3.0
不是精确的三分之一,因此您正在计算base
的立方根。相反,您指定的计算是:
base**0.333333333333333314829616256247390992939472198486328125
或
当base
为125
时,此计算的精确实数结果为:
4.999999999999999553291243227753830961690873860134487744...
与该值最接近的两个可表示双精度值是5.0
和:
4.99999999999999911182158029987476766109466552734375
后一个值与数学上精确的结果非常接近,因此pow
函数返回了可能的最佳(或“正确四舍五入”)答案
当您在base
等于27的情况下进行相同的计算时,数学上精确的实数结果为:
2.99999999999999981704430129767885583952101310176125736...
在这种情况下,这个数字比任何其他可表示的双精度稍接近3.0
,因此pow
再次返回了可能的最佳结果
因此,在这些情况下,pow
函数将为您提示的计算提供最准确的结果。这就是说,pow
不能保证对所有可能的输入都这样做(事实上,通常不会)。对于所有输入,您不会得到如此精确的结果,对于某些平台上的许多输入,您会得到明显不精确的结果。通常,您不应该依赖于pow
函数的最后一位舍入,也不应该依赖于任何未明确定义以产生正确舍入结果的函数的最后一位舍入
简而言之:你得到的结果是最好的结果,而在其他一些平台上你就不会这么幸运了
备选方案:
double-ans=pow([base-doubleValue],1.0/[root-doubleValue])代码>?两个计算都没有使用27。这应该是double ans=pow([base doubleValue],1.0/[root doubleValue])代码>?您的计算都没有使用27。在提到的备选方案中,有27个最终使用cbrt函数。在提到的备选方案中,有27个最终使用cbrt函数。