关于 C++ 中双精度变量的精度
Precision concerning double variable in C++
我的问题是当我这样计算一个变量时:
UXZ=(DRDe*sY*(Ux2 + Uy2) + cY*DRDt*Tau*(Ux2 + Uy2) + DRDx*Tau*Ux*Sqrt(1 + Ux2 + Uy2) + DRDy*Tau*Uy*Sqrt(1 + Ux2 + Uy2))/(Tau*Sqrt(1 - 1/(1 + Ux2 + Uy2)));
这个值 1/(1 + Ux2 + Uy2) 被设置为(严格地)1。然后,我们有一个错误,因为分母等于 0。
但是,项 Ux2 和 Uy2 等于(每个)1E-32。因此,该值并不严格等于 1。
我不知道如何设置计算精度。
这个等式中的每个变量都是双精度的,也许我必须把它们放在 long?
编辑:此计算是在事件生成器中实现的,Ux2 和 Uy2 将在不同的 times/iterations 期间 change/increase。我们从 Ux2 和 Uy2 的一个非常小的值开始,非常接近 0 但不严格为 0。如果我们保持 (1 + 1E-32 + 1E-32)=1。这完全破坏了我的代码。
我的问题的重要代码是:
UXZ=XX/(YY*Sqrt(1 - 1/(1 + Ux2 + Uy2)));
我无法更改 Ux2 和 Uy2 的值,因为这会改变正在考虑的物理问题。
您的 "problem" 期限是:
SQRT( 1 - 1 / ( 1 + Ux2 + Uy2 ) )
因为 SQRT(a)
与 SQRT(b*b * a) / b
相同(即在 中乘以 平方根,然后除以 b
平方根通过 b
),然后 – 使用 (1 + Ux2 + Uy2)
作为 b
– 你得到:
SQRT( (1 + Ux2 + Uy2)*(1 + Ux2 + Uy2) - (1 + Ux2 + Uy2) ) / (1 + Ux2 + Uy2)
其计算结果应为相同的值,而不会触发被零除。
将一些常用表达式(例如 1 + Ux2 + Uy2
)带入变量中可能也很有用。
要理解 为什么 你需要这样做,你需要研究 Numerical Analysis (Wikipedia), in particular, Generation and propagation of errors 的领域,它解决了用大多数计算机语言中使用的有限精度方案。
我远不是这方面的专家,但在它的核心,你必须认识到虽然 1 - 1 / ( 1 + x )
将永远是 "valid",但假设 x
至少是有点积极,在大多数计算机实现中,对于足够小的 x
,1 + x
将退化为恰好 1
。 数值分析 的一部分正在认识到这一点,并重新组织如何 执行计算以更好地利用有限的精度。
我的问题是当我这样计算一个变量时:
UXZ=(DRDe*sY*(Ux2 + Uy2) + cY*DRDt*Tau*(Ux2 + Uy2) + DRDx*Tau*Ux*Sqrt(1 + Ux2 + Uy2) + DRDy*Tau*Uy*Sqrt(1 + Ux2 + Uy2))/(Tau*Sqrt(1 - 1/(1 + Ux2 + Uy2)));
这个值 1/(1 + Ux2 + Uy2) 被设置为(严格地)1。然后,我们有一个错误,因为分母等于 0。
但是,项 Ux2 和 Uy2 等于(每个)1E-32。因此,该值并不严格等于 1。
我不知道如何设置计算精度。 这个等式中的每个变量都是双精度的,也许我必须把它们放在 long?
编辑:此计算是在事件生成器中实现的,Ux2 和 Uy2 将在不同的 times/iterations 期间 change/increase。我们从 Ux2 和 Uy2 的一个非常小的值开始,非常接近 0 但不严格为 0。如果我们保持 (1 + 1E-32 + 1E-32)=1。这完全破坏了我的代码。
我的问题的重要代码是:
UXZ=XX/(YY*Sqrt(1 - 1/(1 + Ux2 + Uy2)));
我无法更改 Ux2 和 Uy2 的值,因为这会改变正在考虑的物理问题。
您的 "problem" 期限是:
SQRT( 1 - 1 / ( 1 + Ux2 + Uy2 ) )
因为 SQRT(a)
与 SQRT(b*b * a) / b
相同(即在 中乘以 平方根,然后除以 b
平方根通过 b
),然后 – 使用 (1 + Ux2 + Uy2)
作为 b
– 你得到:
SQRT( (1 + Ux2 + Uy2)*(1 + Ux2 + Uy2) - (1 + Ux2 + Uy2) ) / (1 + Ux2 + Uy2)
其计算结果应为相同的值,而不会触发被零除。
将一些常用表达式(例如 1 + Ux2 + Uy2
)带入变量中可能也很有用。
要理解 为什么 你需要这样做,你需要研究 Numerical Analysis (Wikipedia), in particular, Generation and propagation of errors 的领域,它解决了用大多数计算机语言中使用的有限精度方案。
我远不是这方面的专家,但在它的核心,你必须认识到虽然 1 - 1 / ( 1 + x )
将永远是 "valid",但假设 x
至少是有点积极,在大多数计算机实现中,对于足够小的 x
,1 + x
将退化为恰好 1
。 数值分析 的一部分正在认识到这一点,并重新组织如何 执行计算以更好地利用有限的精度。