gpt4 book ai didi

c - 逆除法和乘积的准确性

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:41 25 4
gpt4 key购买 nike

<分区>

我正在尝试优化我正在编写的一段 C 代码,我注意到乘积比除法快得多。这是一个众所周知的问题,到处都有很好的解释。

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

我设法写了一个非常简单的例子,其中我所说的区别很明显:

#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 b/Db*Dinv 完全相同。此行为随测试的数字而变化(ab 不是我真正感兴趣的数字,它们只是我测试的示例)。我的问题是:

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

谢谢!

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