Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C-pow函数混合精度结果_Objective C_Floating Point_Precision_Pow_Libm - Fatal编程技术网

Objective c 目标C-pow函数混合精度结果

Objective 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]);

关于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]);
当基数=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
函数的最后一位舍入,也不应该依赖于任何未明确定义以产生正确舍入结果的函数的最后一位舍入

简而言之:你得到的结果是最好的结果,而在其他一些平台上你就不会这么幸运了


备选方案:

    >p>可以考虑使用<代码> CBRT < /代码>函数,它也不能保证正确的舍入,但至少是计算立方根而不是0 3333333333333333×148296…TH幂。

  • 如果事先知道结果应该是整数,可以通过
    round
    rint
    函数将其四舍五入到最接近的整数

  • >P>如果您确实需要最后一位舍入,请考虑使用CRLIBM库。这将带来一些性能成本,但如果您必须进行正确的舍入,那么这是唯一的好选择(但请注意,对于这些特定示例,它将产生完全相同的结果)


      这里有几个因素在起作用。最重要的是,
      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
      函数的最后一位舍入,也不应该依赖于任何未明确定义以产生正确舍入结果的函数的最后一位舍入

      简而言之:你得到的结果是最好的结果,而在其他一些平台上你就不会这么幸运了


      备选方案:

        >p>可以考虑使用<代码> CBRT < /代码>函数,它也不能保证正确的舍入,但至少是计算立方根而不是0 3333333333333333×148296…TH幂。

      • 如果事先知道结果应该是整数,可以通过
        round
        rint
        函数将其四舍五入到最接近的整数

      • >P>如果您确实需要最后一位舍入,请考虑使用CRLIBM库。这将带来一些性能成本,但如果您必须进行正确的舍入,那么这是唯一的好选择(但请注意,对于这些特定示例,它将产生完全相同的结果)


      这应该是
      double-ans=pow([base-doubleValue],1.0/[root-doubleValue])?两个计算都没有使用27。这应该是
      double ans=pow([base doubleValue],1.0/[root doubleValue])?您的计算都没有使用27。在提到的备选方案中,有27个最终使用cbrt函数。在提到的备选方案中,有27个最终使用cbrt函数。