分割的准确性和逆的产品

时间:2016-08-25 12:52:20

标签: c division floating-accuracy

我正在尝试优化我正在编写的一大块C代码,我注意到产品比分区更快。这是一个众所周知的问题,在各地都很好地解释了。

考虑到这种优化,假设我一次又一次地除以相同的数字,我试图只计算一次该数字的倒数然后再乘以它。但是,我注意到结果并不完全相同。

我设法写了一个非常简单的例子,其中我所谈论的差异是明确的:

   override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {

    let cell:DetailApplicantCell = self.table.dequeueReusableCellWithIdentifier("reuseIdentifier") as! DetailApplicantCell

    if let name = object?.objectForKey(self.textKey!) as? String{
    cell.nameLbl.text = name
    }
    cell.groupImage.image = UIImage(named: "People.png")
    if let imageFile = object?.objectForKey(self.imageKey!) as? PFFile{
    cell.groupImage.file = imageFile
    cell.groupImage.loadInBackground()
    }

    return cell

}

如您所见,我测试#include <stdio.h> int main(){ double D = 1.1891; double Dinv = 1./D; double a = 23123.1234; double b = 156.123871; printf("1/D = %.60f\n", 1./D); printf("Dinv = %.60f\n", Dinv); printf("1/D == Dinv? %s\n\n", 1./D == Dinv ? "True" : "False"); printf("a/D = %.60f\n", a/D); printf("a*Dinv = %.60f\n\n", a*Dinv); printf("a/D == a*Dinv? %s\n\n", a/D == a*Dinv ? "True" : "False"); printf("b/D = %.60f\n", b/D); printf("b*Dinv = %.60f\n\n", b*Dinv); printf("b/D == b*Dinv? %s\n\n", b/D == b*Dinv ? "True" : "False"); } 是否等于a/Da*Dinv,以及Dinv = 1/D的相同测试。我机器中此代码的输出如下:

b

正如您在输出中看到的那样,测试结果不同:我们可以看到1/D = 0.840972163821377516335076052200747653841972351074218750000000 Dinv = 0.840972163821377516335076052200747653841972351074218750000000 1/D == Dinv? True a/D = 19445.903120006725657731294631958007812500000000000000000000000000 a*Dinv = 19445.903120006729295710101723670959472656250000000000000000000000 a/D == a*Dinv? False b/D = 131.295829619039608360253623686730861663818359375000000000000000 b*Dinv = 131.295829619039608360253623686730861663818359375000000000000000 b/D == b*Dinv? True 不等于a/D,但a*Dinv与{{1}完全相同}}。此行为随测试的数字而变化(b/Db*Dinv不是我真正感兴趣的数字,它们只是我测试过的例子)。我的问题是:

  1. 为什么ab不同?
  2. 为什么有些数字通过测试而其他数字没有?
  3. 我们能谈谈准确性吗?我的意思是,鉴于a/Da*Dinv,我们可以说其中任何一个都比另一个更准确吗?
  4. 谢谢!

1 个答案:

答案 0 :(得分:1)

要回答部分问题,a/Da*Dinv的结果可能会有所不同,因为在a*Dinv中,a*(1.0f/D)会涉及一个额外的操作,可能导致准确性下降。