我正在尝试优化我正在编写的一大块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/D
,a*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/D
和b*Dinv
不是我真正感兴趣的数字,它们只是我测试过的例子)。我的问题是:
a
和b
不同?a/D
和a*Dinv
,我们可以说其中任何一个都比另一个更准确吗?谢谢!
答案 0 :(得分:1)
要回答部分问题,a/D
和a*Dinv
的结果可能会有所不同,因为在a*Dinv
中,a*(1.0f/D)
会涉及一个额外的操作,可能导致准确性下降。